2017-09-22 15 views
1

可変の列数のテーブルを作成しようとしています。 YH(i、Y1、Y2 .... Yd)エラー:型 'const char *'と 'const char [7]'のバイナリ 'operator +'への無効なオペランド

私はクエリ内でforループを作成しました。

error: invalid operands of types ‘const char*’ and ‘const char [7]’ to 
    binary ‘operator+’ 
    for(int l=1;l<=d;l++) {commandline+=", Y"+ l +" real ";} 

メインコードは以下の通りです - - しかし、それは次のエラーを示しているそれらの

for(int l=1;l<=d;l++) {commandline+=", Y" l " real ";}

for(int l=1;l<=d;l++) {commandline+=", Y"+std::string(l)+" real ";}

なし動いていないようで -

string commandline; 
commandline = "DROP TABLE YH"; 
if(SQL_SUCCESS != SQLExecDirect(hdlStmt, (SQLCHAR*)(commandline.c_str()), SQL_NTS)) 
{ 
    cout<<"The drop YH table is unsuccessful."<<endl; 
} 

commandline = "CREATE TABLE YH" 
     "(i int primary key "; 
for(int l=1;l<=d;l++) { 
    commandline+=", Y"+l+" real "; 
} 
commandline+=") "; 
if(SQL_SUCCESS != SQLExecDirect(hdlStmt, (SQLCHAR*)(commandline.c_str()), SQL_NTS)) 
{ 
    cout<<"The create table sql command hasn't been executed successfully."<<endl; 
} 

は、私は、次の試してみました。

+0

SQL文で二重引用符を使用する場合は、\ "を使用して適切にエスケープします。また、SQLインジェクション攻撃に対してSQL文がチェックされていることを確認してください。 – Jodocus

+0

@Jodocus彼はSQL文で二重引用符を使用しようとしています。 – Barmar

+0

おっと、私はそれを逃した! 'commandline + = std :: string("、Y ")+ std :: to_string(l)+" real ";あるいは、@ user4581301によれば' std :: istringstream'を使います。 –

答えて

1

+を使用して整数を文字列に連結することはできません。あなたは

", Y" + l 

を書くときには、文字列リテラルへのポインタにlを追加し、それはちょうど別のポインタを返します。その後、+ " real"を実行すると、その配列へのポインタを追加しようとしますが、+演算子のオーバーロードはありません。 +は、少なくとも1つの引数がstd::stringである場合にのみ連結に使用できます。

std::string(l)のいずれも動作しません。それはあなたが数字の文字列表現を得る方法ではありません。必要な機能はstd::to_string(l)です。

commandline += ", Y" + std::to_string(l) + " real "; 
+0

'to_string'は 'std'のメンバーではありません –

+0

どのバージョンのC++を使用していますか? 'std :: to_string'はC++ 11の機能です。 – Barmar

+0

私はそれをC++ 11に変更しました。どうもありがとうございました。 –

0

代替事前C++ 11のアプローチ:一言で言えば

Documentation on std::ostringstream

ostringstreamはあなたのプログラムが簡単にあなたがstringに同じように変換し、自己リサイズバッファに書き込むことができます他の入力ストリームに書き込みます。例えば、coutのようになります。

// create the ostringstream around the initial string data 
ostringstream commandline("CREATE TABLE YH (i int primary key "); 
for(int l=1;l<=d;l++) { 
    // write into the ostringstream. l will automatically be converted from a number 
    commandline << ", Y" << l <<" real "; 
} 
commandline << ") "; 

// (str() gets the string from the ostringstream. 
// c_str() converts this string into a character array 
if(SQL_SUCCESS != SQLExecDirect(hdlStmt, (SQLCHAR*)(commandline.str().c_str()), SQL_NTS)) 
{ 
    cout<<"The create table sql command hasn't been executed successfully."<<endl; 
} 
+1

それは 'ostringstream'ではないでしょうか? – Barmar

+0

Fud。ありがとう。修正する。 – user4581301

+0

男、私はそれをスクラップアップして、「シン」に至った。間違いなく就寝前。 – user4581301

関連する問題