gpt4 book ai didi

c - ODBC 驱动程序管理器调用 SQLDriverConnect 时出错

转载 作者:行者123 更新时间:2023-11-30 17:38:48 25 4
gpt4 key购买 nike

我正在尝试使用 SQLDriverConnect 连接到我的驱动程序。这是我的程序。

#include"stdio.h"
#include"stdlib.h"
#include"windows.h"
#include"sqlext.h"
#include"string.h"
#include"sqltypes.h"
#include"conio.h"
SQLHENV henv = (SQLHENV) NULL;


typedef struct
{
SDWORD pfNativeError[1];
SWORD pcbErrorMsg[1];
SWORD cbErrorMsgMax;
UCHAR *szErrorMsg;
UCHAR *szSqlState;
}ERR_INFO;


RETCODE odbc_Error(SQLHENV hEnv, SQLHDBC hDbc, SQLHSTMT hStmt);

RETCODE odbc_Error(SQLHENV hEnv,SQLHDBC hDbc,SQLHSTMT hStmt)
{
char *szBuf;
int pt_ch ='.' ;
int brac_ch =']' ;
ERR_INFO *Err;
RETCODE st = 0;

Err = (ERR_INFO *)malloc (sizeof(ERR_INFO));
Err->szErrorMsg = (UCHAR* )malloc(200);
Err->szSqlState = (UCHAR* )malloc(50);
szBuf = (char *)malloc(600);
memset (Err->szErrorMsg,'\0',200);
memset (Err->szSqlState,'\0',50);
memset (szBuf,'\0',600);

if (hStmt)
st = SQLGetDiagRec(SQL_HANDLE_STMT,hStmt,1,Err->szSqlState,
Err->pfNativeError, Err->szErrorMsg,150,Err->pcbErrorMsg);

else if (hDbc)
st = SQLGetDiagRec(SQL_HANDLE_DBC,hDbc,1,Err->szSqlState,
Err->pfNativeError, Err->szErrorMsg,150,Err->pcbErrorMsg);

else if (hEnv)
st = SQLGetDiagRec(SQL_HANDLE_ENV,hEnv,1,Err->szSqlState,
Err->pfNativeError, Err->szErrorMsg,150,Err->pcbErrorMsg);

if ((st == SQL_SUCCESS) || (st == SQL_SUCCESS_WITH_INFO))
{
sprintf(szBuf," %s - [%s]\n", (char *)Err->szErrorMsg, Err->szSqlState);
printf("%s \n",szBuf);
}

free(Err->szErrorMsg);
free(Err->szSqlState);
free(Err);
free(szBuf);

return SQL_SUCCESS;
}
#define ARRAY_SIZE 8
#define MAX_BINDPARAM1 17
#define DRVC_LEN 1024
struct // We have to support bit, tinyint, binary, varbinary, long varbinary
{
SQLSMALLINT SQLType[MAX_BINDPARAM1];
} CDataArgToSQL1 =
{
SQL_CHAR,SQL_VARCHAR,SQL_DECIMAL,SQL_NUMERIC,SQL_SMALLINT,SQL_INTEGER,SQL_REAL,
SQL_FLOAT,SQL_DOUBLE,SQL_DATE,SQL_TIME,SQL_TIMESTAMP,SQL_LONGVARCHAR,SQL_BIGINT,
SQL_CHAR,SQL_VARCHAR,SQL_LONGVARCHAR
};

int main()
{
int j =0;
int i = 0;
int k=0;
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt[1900];
SQLRETURN retcode;
SQLPOINTER rgbValue = &i;
SQLRETURN st = 0;
SQLPOINTER ValuePtr = NULL;
SQLHWND hwnd=NULL;
char buf[450];
int len;


char query[400]={'\0'};
char connstr[DRVC_LEN]={'\0'};
char szConnStrOut[DRVC_LEN];
SWORD cbConnStrOut;


printf("\n\tUsing Data Source :Vivek \n\n");

printf("Test Negative Functionality of SQLDriverConnect: only \n");
strcpy(connstr,"DSN=VIV_OFF32_64A;UID=super.super;PWD=nedops;");

retcode = SQLAllocEnv(&henv);
if (retcode != SQL_SUCCESS)
{
printf("Error in Connection\n");
odbc_Error(henv,hdbc,NULL);
getch();

}

retcode = SQLAllocConnect(henv, &hdbc);
if (retcode != SQL_SUCCESS)
{
printf("Error in Connection\n");
odbc_Error(henv,hdbc,NULL);
getch();

}

retcode = SQLDriverConnect(hdbc,hwnd,(SQLCHAR*)connstr,SQL_NTS,(SQLCHAR*)szConnStrOut,DRVC_LEN,&cbConnStrOut,SQL_DRIVER_PROMPT);
if (retcode != SQL_SUCCESS)
{
printf("Error in Connection\n");
odbc_Error(henv,hdbc,NULL);
getch();

}
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
}

当我使用SQL_DRIVER_NOPROMPSQL_DRIVER_COMPLETESQL_DRIVER_COMPLETE_REQUIRED时,我成功了。

我的目标是使用 SQLDriverConnect 提示一个窗口。

最佳答案

您需要向 SQLDriverConnect 提供一个窗口句柄,并且只需传递 NULL。

如果没有窗口句柄,它将如何显示对话框。

如果您在控制台中运行它,有多种方法可以获取窗口句柄。

顺便说一句,您将旧的 ODBC API 与新的 API 混合在一起,例如 SQLAllocConnect/SQLGetDiagxxx 和 SQLDriverConnect。如果这是一个新应用程序,您最好至少使用 ODBC 3 API 来编写它,这样您就可以使用 SQLAllocHandle、SQLFreeHandle 和 SQLSetEnvAttr 来请求 ODBC 3 行为。

关于c - ODBC 驱动程序管理器调用 SQLDriverConnect 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22032731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com