使用 ODBC 的 MSSQL 数据库中的垃圾 varchar 条目

Junk varchar entries in MSSQL database using ODBC

我正在尝试将 string-variable 插入到 varchar(100) 字段中,但如果字符串的长度超过 15 个元素,则只会插入垃圾(例如“0‰?”)。

首先我的设置:

开发:Win7(64位)/VS2013/C++11/64位应用程序

数据库:Win8(64 位)/Microsoft SQL Server Express 2014(64 位)

Driver: SQL 服务器本机客户端 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;               
   }

   (...)
}

Header 程序:

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 的过程也能正常工作。

我想到的一件事是您正在调用的过程。也许您有 table 和 varchar(100) 列,但该过程只有 varchar(15) 参数。你能postheader那个程序吗?

感谢@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;

   (...)
}