首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从ODBC连接SQLConnect?

如何从ODBC连接SQLConnect?
EN

Stack Overflow用户
提问于 2020-06-20 20:24:19
回答 1查看 374关注 0票数 0

我试图用ODBC和C++连接到Server,但它无法连接,我不知道为什么。DSN已在用户DSN列表中设置。

2017.175.02.01

  • SQL

  • Windows 10 64位

  • 编译器: VC++ 2010

  • ODBC版本:

  • 2019

代码语言:javascript
复制
# include "stdafx.h"
# include <windows.h>
# include <stdio.h>
# include <stdlib.h>
# include <sql.h>
# include <sqlext.h>
# include <iostream>
 
int main( )
{
    HENV henv;
    HDBC hdbc;
    RETCODE rc;
    
    SQLAllocEnv(&henv);
    SQLAllocConnect(henv, &hdbc);
 
    /* Connect to the database using the ODBC DSN definition. */
    rc = SQLConnect( hdbc,     /* Connection handle */
        (SQLWCHAR*)"db1",      /* The ODBC DSN definition */
        SQL_NTS,               /* This is a null-terminated string */
        NULL,                  /* No username required */
        0,                     /* This is a null-terminated string */
        NULL,                  /* No password required */
        0);                    /* This is a null-terminated string */

    if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO))
    {
        SQLFreeConnect(hdbc);
        SQLFreeEnv(henv);
        std::cout << "FAIL\n";
    }
    else{
        SQLFreeConnect(hdbc);
        SQLFreeEnv(henv);
        std::cout << "YEA! \n";
    }

    /* Exit this program. */
    system("pause");
    return( 0 );
}

解决方案:需要声明变量类型并将其值设置为SQLConnect。多亏了PaulMcKenzie。

代码语言:javascript
复制
    SQLWCHAR name [] = L"db1";
    
    rc = SQLConnect( hdbc,     /* Connection handle */
        name,                  /* The ODBC DSN definition */
        SQL_NTS,               /* This is a null-terminated string */
        NULL,                  /* No username required */
        0,                     /* This is a null-terminated string */
        NULL,                  /* No password required */
        0);                    /* This is a null-terminated string */
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-21 00:48:28

这不能像你想的那样做:

(SQLWCHAR*)"db1",

如果SQLWCHAR*是一个指向宽字符的指针,那么转换一个非宽字符串将不会产生所需的结果,因为强制转换不会神奇地将非宽字符串文字转换为宽字符串。ODBC函数失败是由于"db1"字符串在接收到该字符串时以某种方式导致不正确。

处理这个问题的正确方法是首先让代码编译,而不需要任何字符串类型到字符串类型的强制转换。转换字符串类型是可能出错的迹象。使用函数所需的字符串类型。

这适用于任何应用程序--如果你正在转换字符串类型,你最好确切地知道你在做什么,因为你可能是在规避C++的类型安全,通过发出C风格的强制转换来抑制编译器错误。

在本例中,字符串类型为SQLWCHAR,因此可以创建一个字符串(在本例中,由于它不是const指针而可以修改):

SQLWCHAR name [] = L"db1";

然后,函数将不需要对第二个参数进行强制转换:

代码语言:javascript
复制
rc = SQLConnect( hdbc,     /* Connection handle */
    name,                  /* The ODBC DSN definition */
    SQL_NTS,               /* This is a null-terminated string */
    NULL,                  /* No username required */
    0,                     /* This is a null-terminated string */
    NULL,                  /* No password required */
    0);          
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62491255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档