Проблемы с SQL и C # - PullRequest
       16

Проблемы с SQL и C #

1 голос
/ 09 февраля 2012

Я пытаюсь изменить таблицу в базе данных следующим образом:

using (SqlCeCommand com = new SqlCeCommand("INSERT INTO RamResults(Result, Date) VALUES(@num, @date)", con))
{
    com.Parameters.AddWithValue("@num", num);
    com.Parameters.AddWithValue("@hostname2", hostname2);
    com.Parameters.AddWithValue("@date", Form1.date);
    com.ExecuteNonQuery();
}

Хотя имя таблицы имеет префикс переменной (hostname2). Поэтому я попытался сделать следующее:

("INSERT INTO @hostname2 + RamResults(Result, Date) VALUES(@num, @date)", con))

Но не повезло, у кого-нибудь есть идеи, чтобы решить эту проблему?

Сообщение об ошибке:

Произошла ошибка при разборе запроса. [Номер строки токена = 1, токен смещение строки = 13, токен по ошибке = @ hostname2]

Ответы [ 4 ]

3 голосов
/ 09 февраля 2012

Если вы используете готовые заявления, подобные этому, @hostname2 будет заменено на 'value'.
Вы должны использовать string.Format() вместо:

string hostprefix = 'host2_'; // example
string sql = string.Format("INSERT INTO {0}RamResults(Result, Date) "+
                            " VALUES(@num, @date)", hostprefix);
using (SqlCeCommand com = new SqlCeCommand(sql, con))
// ....

НО используйте только строку. Формат для вашего префикса хоста, НЕ для ввода пользователем! Таким образом, вы можете предотвратить SQL-инъекции.

1 голос
/ 09 февраля 2012

измените код следующим образом:

new SqlCeCommand(String.Format("INSERT INTO {0}RamResults (Result, Date) VALUES(@num, @date)", hostname2), con))

и больше не передавайте / устанавливайте параметр @ hostname2.Параметры SQL не совпадают с динамической генерацией SQL ...

0 голосов
/ 09 февраля 2012

Как и в «обычном» SQL, имя таблицы для вставки не может быть параметризовано.

0 голосов
/ 09 февраля 2012

Вы не можете изменять имена таблиц с параметрами. Для этой части вам нужно будет использовать динамический SQL.

...