Оператор SQL в ODBC

Я пишу приложение ODBC на C! У меня есть таблица в моей базе данных, и я собираюсь заполнить ее некоторыми переменными: Var1, Var2, ..., которые являются выходными данными некоторой функции. Вопрос в том, как в функции SQLExecDirect мне перейти к оператору SQL (StatementText) к переменным?

SQLExecDirect(hStmt, (SQLCHAR *)"INSERT INTO Table1 values (Var1, Var2, ...)", SQL_NTS);

person Homer    schedule 12.10.2015    source источник


Ответы (2)


В SQL на C вы создаете полный оператор SQL, печатая (форматируя) его в буфере. Итак, если вы хотите вставить значения ваших переменных в свою таблицу, вы печатаете их значения в буфер, например:

    char szSQL[2048];
    sprintf (szSQL, "INSERT INTO %s values('%s', %d,'%s');", szTableName, strVar1, intVar, strVar2);
    SQLExecDirect(hStmt, szSQL, SQL_NTS);

Обратите внимание на одинарные кавычки вокруг строковых переменных и обратите внимание на отсутствие кавычек вокруг целочисленной переменной. Обратите внимание, что это требование вашей TABLE, а не C. Если целочисленная переменная в вашей таблице определена как строковое поле, вы также должны поместить переменную в кавычки в операторе SQL, '%d'.

Наконец, если строковые переменные могут содержать одинарную кавычку, вы должны экранировать их как две одинарные кавычки.

person Paul Ogilvie    schedule 12.10.2015

У вас есть два варианта:

  1. You can use sprintf to build your SQL string as Paul Ogilvie shows in his answer;
  2. You can use a prepared statement and bind the variables to it in a separate operation (see example at link).

Подготовленные операторы могут повысить производительность, если вы повторяете один и тот же оператор несколько раз с разными значениями (как показано по ссылке). Они также могут защитить от атак с внедрением SQL (по крайней мере, до определенного момента), но вы все равно должны дезинфицировать свои входные данные. Компромисс заключается в том, что подготовленный оператор требует немного больше усилий по кодированию.

person John Bode    schedule 12.10.2015