C # Подготовленные заявления - запросы @ sign (at / strudel sign) - PullRequest
9 голосов
/ 10 февраля 2011

У меня проблема с подготовленным оператором в C #:

OdbcCommand cmd = sql.CreateCommand();
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?";
cmd.Parameters.Add("@USER_ID", OdbcType.VarChar, 250).Value = email;

(конечно, электронная почта содержит действительный адрес электронной почты со знаком @).

Этот код возвращает случайную ошибку -

«Соединение было отключено» {"ОШИБКА [01000] [Microsoft] [ODBC SQL Драйвер сервера] [TCP / IP Сокеты] ConnectionWrite (send ()). ОШИБКА [08S01] [Microsoft] [ODBC SQL Драйвер сервера] [Сокеты TCP / IP] Общие ошибка сети. Проверьте свою сеть документация. "}

Однако, если я запускаю свой код без подготовленного оператора, это означает:

cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = '"+email+"'";

Все отлично работает.

Может быть, это связано с тем, что у меня есть знак @ в параметризованном значении? Я склонен думать, что я не первый, кто пытается создать готовое заявление с адресом электронной почты ...

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

Можете ли вы помочь? :) Спасибо, Нили

Ответы [ 3 ]

7 голосов
/ 15 мая 2011

Действительно, у ODBC есть свои проблемы с поддержкой именованных параметров.Однако возможно использование определенных именованных параметров.

Например, в вашем случае работает следующий синтаксис:

OdbcCommand cmd = sql.CreateCommand();
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?";
cmd.Parameters.Add("USER_ID", OdbcType.VarChar, 250).Value = email;

Более сложная ситуация, когда у вас нет уникального соответствия длятакой параметр как USER_ID =?;Например, если вы хотите использовать оператор IN в предложении WHERE .

Тогда следующий синтаксис выполнит эту работу:

OdbcCommand cmd = sql.CreateCommand();
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID IN (?, ?)";
cmd.Parameters.Add("?ID1", OdbcType.VarChar, 250).Value = email1;
cmd.Parameters.Add("?ID2", OdbcType.VarChar, 250).Value = email2;

Обратите внимание на использование ? (знак вопроса) вместо @ (в знаке) в имени параметра.Хотя обратите внимание, что подстановка значений параметров в этом случае не имеет ничего общего с их именами, а только с их порядком в наборе параметров.

Надеюсь, это поможет: -)

3 голосов
/ 10 февраля 2011

Есть ли конкретная причина, по которой вы используете OdbcCommand вместо поставщика SqlClient?

С провайдером SqlClient вы должны использовать именованные параметры, как предлагали другие.

Но в соответствии с MSDN :

Поставщик данных .NET Framework для OLE DB и поставщик данных .NET Framework для ODBC не поддерживают именованные параметры для передачи параметров в оператор SQL или хранимую процедуру. В этом случае необходимо использовать заполнитель вопросительного знака (?), Как в следующем примере.

Так что я не уверен, что именованные параметры будут работать в этом случае.

2 голосов
/ 10 февраля 2011

Используйте '@USER_ID' вместо '?'и все должно работать:

OdbcCommand cmd = sql.CreateCommand();
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = @USER_ID";
cmd.Parameters.Add("@USER_ID", OdbcType.VarChar, 250).Value = email;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...