使用ODBC

时间:2015-06-16 07:56:23

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

我试图将字符串变量插入到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也很好。

2 个答案:

答案 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;

   (...)
}