2017-09-22 1 views
1

가변 개수의 열로 테이블을 만들려고합니다. YH (i, Y1, Y2 .... Yd)오류 : 'const char *'및 'const char [7]'- 2 진 '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"을 수행하면 해당 배열에 포인터를 추가하려고 시도하지만 + 연산자에 대한 오버로드가 없습니다. +은 인수 중 하나 이상이 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

남자, 나는 그 망가질을 따라 'cin'까지 끝까지 갔다. 확실히 과거의 취침 시간. – user4581301

관련 문제