c ++ mysql setString не заменяет заполнители в подготовленном выражении

У меня есть следующий код для установки значений по умолчанию:

int main()
{
try
{
sql::Driver *driver;
sql::Connection *con;
sql::PreparedStatement *pstmt;

/* Create a connection */
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "$user", "$password");
/* Connect to the MySQL test database */
con->setSchema("db");

string cols[] = { "email", "phone", "first_lead", "address", "city", "state", "country", "client_id" };
string filler[] = { "email_address@email.com","7777777777", "YYYY-MM-DD", "street_address", "city", "state", "country", "client_id" };

pstmt = con->prepareStatement("ALTER table clients modify column ? varchar(255) not null default \'?\'");

for (int i = 0; i <= 8; ++i)
{
pstmt->setString(1, cols[i].c_str());
pstmt->setString(2, filler[i].c_str());
pstmt->execute();
}
delete pstmt;
delete con;
} catch (sql::SQLException &e)
{
cout << "# ERR: SQLException in " << __FILE__;
cout << "(" << __FUNCTION__ << ") on line "<< __LINE__ << endl;
cout << "# ERR: " << e.what();
cout << " (MySQL error code: " << e.getErrorCode();
cout << ", SQLState: " << e.getSQLState() <<
" )" << endl;
}

cout << endl;
system("pause");
return EXIT_SUCCESS;
}

Когда я запускаю код, он попадает в назначение pstmt и возвращает следующую ошибку:

# ERR: SQLException in c:\users\ray\documents\visual studio 2015\projects\project3\project3\source.cpp(main) on line 56
# ERR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? varchar(255) not null default '?'' at line 1 (MySQL error code: 1064, SQLState:  ?Σ╥Å  ╠╠╠╠╠╠╠ )

Код, похоже, не распознает и не заменяет заполнители. Я неправильно реализую setString?

0

Решение

Исключение должен быть брошенным на унитарную подготовку — остальные никогда не должны быть выполнены.

Подготовленные заявления не работают таким образом.

Они не являются заменой строк.

Параметры в подготовленных утверждениях для значений данных только — не идентификаторы объекта или любая другая часть оператора SQL. Просто значения данных.

Вы не можете, например, подготовить заявление SELECT ? FROM ? и используйте параметры «id» и «table1», как будто вы запросили SELECT id FROM table1;, SQL — в любом движке базы данных — не позволит этого.

Подготовленные операторы сначала анализируются, а затем используются значения — без интерполяции строк — когда выполняется оператор.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector