2014-02-26 124 views
0

我正在嘗試使用SQLDriverConnect連接到我的驅動程序。這是我的程序。ODBC驅動程序管理器調用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我得到succeess。

我的目標是提示使用SQLDriverConnect的窗口。

+0

謝謝codemania.I總是面臨這個編輯問題.. –

回答

0

您需要爲SQLDriverConnect提供窗口句柄,並且您只是傳遞NULL。

沒有窗口句柄它將如何顯示對話。

如果您正在控制檯中運行該窗口句柄,有辦法獲得窗口句柄。

另外,您正在將舊的ODBC API與新的ODBC API混合,例如SQLAllocConnect/SQLGetDiagxxx和SQLDriverConnect。如果這是一個新的應用程序,最好至少使用ODBC 3 API編寫它,以便使用SQLAllocHandle,SQLFreeHandle和SQLSetEnvAttr來請求ODBC 3行爲。

相關問題