SQLBindParameter和SQLExecute返回SQL_NEED_DATA

时间:2015-09-18 12:03:07

标签: c sql-server

我正在开发一个与Windows 2008 R2上运行的mssql数据库交互的C应用程序。我能够连接到数据库并运行特定的查询,但是当我使用SQLBindParameter时,事情就会崩溃。

我发现stackoverflow上的帖子似乎是同一个问题,但解决方案看起来并不相同(Problems getting SQLBindParameter to work in C++)。根据C数据类型,SQL_C_CHAR是正确的(https://msdn.microsoft.com/en-us/library/windows/desktop/ms714556(v=vs.85).aspx

这是代码

    SQLINTEGER strlentemp = SQL_NTS;
    SQLCHAR *sqlstmt = "select * from detail where name = ?";
    status = SQLPrepare(hstmt->hstmt, sqlstmt, SQL_NTS);
    unsigned char *temp = "myvalue";
    status = SQLBindParameter(hstmt->hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 50,0,temp,strlen(temp),&strlentemp);
    status = SQLExecute(hstmt->hstmt);

SQLExecute将返回99,SQL_NEED_DATA。如果我在SQLExecute之后调用SQLParamData它也返回99而ValuePtrPtr(第二个参数)是我通过的数据(temp)。

有什么想法?我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果SQLBindParameter()成功但SQLExecute()返回SQL_NEED_DATA,那么SQLBindParameter()的使用不正确,通常是值大小或字段大小。

对ANSI和宽字符串尝试以下代码:

SQLRETURN SQLBindStringW(SQLHSTMT hstmt, SQLUSMALLINT ipar, LPCWSTR szString)
{
    SQLRETURN ret;
    SQLULEN len;
    SQLINTEGER size;
    SQLPOINTER pData;

    len = wcslen(szString);
    size = len * sizeof(WCHAR);
    pData = (SQLPOINTER)szString;
    StrLen = SQL_NTSL;
    ret = ::SQLBindParameter(hstmt, ipar, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WVARCHAR, len, 0, pData, size, &StrLen);
    return ret;
}

SQLRETURN SQLBindStringA(SQLHSTMT hstmt, SQLUSMALLINT ipar, LPCSTR szString)
{
    SQLRETURN ret;
    SQLULEN len;
    SQLINTEGER size;
    SQLPOINTER pData;

    len = strlen(szString);
    size = len * sizeof(CHAR);
    pData = (SQLPOINTER)szString;
    StrLen = SQL_NTSL;
    ret = ::SQLBindParameter(hstmt, ipar, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, len, 0, pData, size, &StrLen);
    return ret;
}