1

要件があります。私のプロジェクトでは、制御文字 (ASCII 文字の範囲は 0 から 31) を保存する必要があります。しかし、ここでは文字の形で保存する必要があります。AC コードを書きましたが、うまくいきませんでした。私が書いたコードをここに投稿しています。私の 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 のデータ型は、サイズ 33 の varchar です。

私の要件を達成するために、上記のコードで何をする必要があるかを教えてください。

ありがとうございます。

4

1 に答える 1

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, &parameter );

mysql_stmt_execute(stmt);
mysql_stmt_close(statement);

あるいは、列タイプの varchar を使い続ける必要がある場合は、おそらく上記の buffer_type を次のように置き換えることができますMYSQL_TYPE_STRING

于 2012-07-12T15:34:29.163 に答える