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

Junk varchar entries in MSSQL database using ODBC

本文关键字:varchar 条目 数据库 ODBC MSSQL 使用      更新时间:2023-10-16

我正在尝试将字符串变量插入到 varchar(100) 字段中,但如果字符串长度超过 15 个元素,则只插入垃圾(例如"0‰?")。

首先我的设置:

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

数据库: Win8 (64bit)

/Microsoft SQL Server Express 2014 (64bit)

驱动程序: SQL Server 本机客户端 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 管理工作室调用值长度为 15>的过程也可以正常工作。

我想到的一件事是你正在调用的过程。也许你有带有 varchar(100) 列的表,但该过程只有 varchar(15) 参数。你能发布该程序的标题吗?

感谢@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;
   (...)
}