我正在尝试将字符串变量插入到 varchar(100) 字段中,但如果字符串的长度超过 15 个元素,则只会插入垃圾(例如“0‰?”)。
首先我的设置:
开发:Win7(64位)/VS2013/C++11/64位应用
数据库:Win8(64 位)/Microsoft SQL Server Express 2014(64 位)
驱动程序:SQL Server Native Client 11.0
第二个参数的绑定(bind):
std::string mMessageText;
SQLHANDLE mSqlStatementHandle;
std::string mExecString;
bool initConnection()
{
mExecString = "{? = CALL dbo.InsertTestProcedure(?, ?, ?, ?, ?)}";
(...)
// bind parameters
SQLBindParameter(mSqlStatementHandle, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 100, 0, (SQLPOINTER)mMessageText.c_str(), mMessageText.length(), NULL);
(...)
// prepare handle with execution string
if (SQL_SUCCESS != SQLPrepare(mSqlStatementHandle, (SQLCHAR*)mExecString.c_str(), (SQLSMALLINT)mExecString.length()))
{
throwError(SQL_HANDLE_STMT, mSqlStatementHandle);
return false;
}
}
第三次查询执行:
bool fillDb()
{
(...)
mMessageText = "This text is longer than 15";
// execute SQL statement
if (SQL_SUCCESS != SQLExecute(mSqlStatementHandle))
{
throwError(SQL_HANDLE_STMT, mSqlStatementHandle);
return false;
}
(...)
}
程序头:
ALTER PROCEDURE [dbo].[InsertTestProcedure]
@MessageComp VARCHAR(20),
@MessageType VARCHAR(20),
@MessageAction VARCHAR(20),
@MessageText VARCHAR(100),
@MessageName VARCHAR(20)
AS
如果字符串少于 15 个元素,则可以正常工作。从 SQL Management Studio 中调用值长度大于 15 的过程也能正常工作。
最佳答案
我想到的一件事是您正在调用的过程。也许您有包含 varchar(100) 列的表,但该过程只有 varchar(15) 参数。您可以发布该程序的标题吗?
关于c++ - 使用 ODBC 的 MSSQL 数据库中的垃圾 varchar 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30861836/