我正在开发一个与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)。
有什么想法?我错过了什么?
答案 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;
}