我试图将字符串变量插入到varchar(100)-field中,但如果字符串超过15个元素,则只插入垃圾(例如" 0‰?" )。
首先我的设置:
开发:Win7(64位)/ VS2013 / C ++ 11/64位应用程序
数据库:Win8(64位)/ Microsoft SQL Server Express 2014(64位)
驱动程序:SQL Server Native Client 11.0
第二个参数的绑定:
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也很好。
答案 0 :(得分:0)
我想到的一件事是你打电话的程序。也许你有varchar(100)列的表,但该过程只有varchar(15)参数。你可以张贴那个程序的标题吗?
答案 1 :(得分:0)
感谢@erg,这是适用于我的解决方案:
char mMessageText[100];
bool initConnection()
{
(...)
// bind parameters
SQLBindParameter(mSqlStatementHandle, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 100, 0, (SQLPOINTER)mMessageText, 100, NULL);
(...)
}
bool fillDb()
{
(...)
std::string lMessageText = "This text is longer than 15";
strcpy(mMessageText, lMessageText.c_str());
mMessageText[sizeof(mMessageText) - 1] = 0;
(...)
}