2015-09-23 4 views
0

Я хотел бы использовать ODBC в C++. Эта строка кода возвращает -2 (rc=-2). Я думаю, что это код ошибки, но я не знаю, какая ошибка?определение статуса ошибки odbc с помощью C++

rc=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_DEFAULT, SQL_SS_TABLE,10,0,TVPTableName,SQL_NTS,&cbTVPTableNAme); 

Я написал этот блок кода для извлечения состояния, но он ничего не возвращает:

void extract_error(
     char *fn, 
     SQLHANDLE handle, 
     SQLSMALLINT type) 
    { 
    SQLINTEGER i = 0; 
    SQLINTEGER native; 
    SQLWCHAR state[ 7 ]; 
    SQLWCHAR text[256]; 
    SQLSMALLINT len; 
    SQLRETURN ret; 
    fprintf(stderr, 
      "\n" 
      "The driver reported the following diagnostics whilst running " 
      "%s\n\n", 
      fn); 

    do 
    { 
     ret = SQLGetDiagRec(type, handle, ++i, state, &native, text, 
     sizeof(text), &len); 
     if (SQL_SUCCEEDED(ret)) 
     printf("%s:%ld:%ld:%s\n", state, i, native, text); 
    } 
    while(ret == SQL_SUCCESS); 
    } 

знает ли кто-то, что делает этот код означает?

Вот мой полный код:

#include <windows.h> 
#include <stdlib.h> 
#include <stdio.h> 

#include <sql.h> 
#include <sqlext.h> 
#include<sqltypes.h> 




#include<exception> 
#include<iostream> 
#include<stdio.h> 


#include "Debug\sqlncli.h"; 
int main() 
{ 
    SQLHENV henv=SQL_NULL_HENV; 
    SQLHDBC hdbc=SQL_NULL_HDBC; 
    SQLHSTMT hstmt=SQL_NULL_HSTMT; 
    RETCODE rc; 

    SQLWCHAR dsn[30] = L"mssqltest"; //Name DNS 
    SQLWCHAR user[10] = L"di_test"; 
    SQLWCHAR pass[10] = L"di_test"; 

    SQLCHAR retValFName[256]; 
    SQLCHAR retValLName[256]; 
    SQLINTEGER cbLName,cbFName; 
    SQLLEN cName=0; 

    SQLCHAR *TVPTableName=(SQLCHAR *) "Person"; 


    SQLINTEGER Arraycode[10]={214,524,635,879,124,951,357,845,236,438}; 
    SQLCHAR Arrayname[10]={ 'P', 'C', 'A', 'G', 'd', 'S', 'R', 'U', 'Q'}; 

    SQLLEN cbTVPTableNAme,cbArraycode[10],cbArrayname[10]; 

    //This line is very important for working with TVP 
    // 10 is the number of values, which should be added to TVP 
    rc=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_DEFAULT, SQL_SS_TABLE,10,0,TVPTableName,SQL_NTS,&cbTVPTableNAme); 
    extract_error(" ",hstmt,SQL_HANDLE_STMT); 
} 
+0

«Вот мой полный код:« вы забыли заголовки. –

+0

Oh Извините, я обновил свой код – Kaja

ответ

0

Ответный код -2 определяется SQL_INVALID_HANDLE. Возможно, драйвер не получит никакой информации об ошибке для недопустимого дескриптора.

Кроме того, из вашего кода вы никогда не создаете действительный дескриптор, вы вызываете функцию SQLBindParameter с помощью дескриптора SQL_NULL_HSTMT - это не может работать.

Вы должны сначала позвонить SQLAllocHandle, чтобы присвоить действительный дескриптор дескриптора (которому нужен действительный дескриптор соединения и выделить один раз из тех, для которых вам нужен действительный дескриптор среды). Смотрите здесь для получения дополнительной информации:

https://msdn.microsoft.com/en-us/library/ms712455%28v=vs.85%29.aspx

Кроме того, из этого, я думаю, что ваша функция, чтобы извлечь ошибки должны работать. Просто передайте действительный дескриптор.

Смежные вопросы