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

标签 c++ sql-server c++11 odbc

我正在尝试将字符串变量插入到 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/

相关文章:

c++ - 通用指数退避重试机制 C++11

c++ - C++11 中的全局常量

c++ - 以编程方式在 QTreeView 中选择一行

C++ 套接字 - 服务器不接受多个客户端 (linux)

c++ - std::chrono::duration 缺乏即时滴答计数操作的原因是什么?

sql - 如何计算SQL中2次之间的差异

sql - 在子查询中分组?

c++ - 使用二分搜索树存储多维 vector

c++ - 替换 sync() 命令

sql - 如果记录存在于 A 中则返回记录,否则如果记录存在于 B 中则返回记录,否则返回 null