我有一个要求。在我的项目中,我需要存储控制字符(ASCII字符范围从0到31)。但在这里我需要以角色的形式存储。我写了一个c代码,但它没有用。我在这里发布我写的代码。 我的IDE是Visual Studio 2010,我正在使用MySQL Connector C 6.0.2
#include "stdafx.h"
#include <iostream>
#include <string>
#include<my_global.h>
#include <mysql.h>
using namespace std;
MYSQL* Connection, MySQL;
int _tmain(int argc, _TCHAR* argv[])
{
int i;
string sData;
char SQLString[384];
for(i=0;i<=31;i++)
sData+=i;
char *Hostname="localhost", *Username="root", *Password="system123", *Database="file_data";
mysql_init(&MySQL);
Connection = mysql_real_connect(&MySQL, Hostname, Username, Password, Database, 0, 0, 0);
if (Connection == NULL)
exit(1);
sprintf_s(SQLString,384,"set sql_mode='NO_BACKSLASH_ESCAPES';");
mysql_query(Connection, SQLString );
sprintf_s(SQLString,384,"insert into file_values(first_data)values('%s')",sData.c_str());
mysql_query(Connection, SQLString );
return 0;
}
这里,在编写实际的项目代码之前,我写了一个示例应用程序来测试是否能够存储,但是通过使用上面的代码,我无法将控制字符存储在file_values表的first_data列中。
first_data的数据类型是varchar,大小为33。
请告诉我上面代码中我需要做的更改,以实现我的要求。
感谢所有人。
答案 0 :(得分:0)
您可能应该为此使用预准备语句,而不是尝试将字符代码嵌入字符串中。使用blob数据类型而不是字符串也可能更好。
这是一个(未经测试的)如何使用预准备语句存储blob的示例:
MYSQL_STMT* statement = mysql_stmt_init(Connection);
std::string statementStr = "insert into file_values(first_data) values (?)";
mysql_stmt_prepare( &statement, statementStr.c_str(), statementStr.length() );
MYSQL_BIND parameter;
parameter[0].buffer_type= MYSQL_TYPE_BLOB;
parameter[0].buffer= (char*)sData.c_str();
parameter[0].is_null= 0;
parameter[0].length= sData.length();
mysql_stmt_bind_param( statement, ¶meter );
mysql_stmt_execute(stmt);
mysql_stmt_close(statement);
或者,如果你需要为列类型坚持使用varchar,你可以用MYSQL_TYPE_STRING
替换上面的buffer_type