Конкатенация в C # с SQL Query for Access Database - PullRequest
3 голосов
/ 31 декабря 2011

У меня есть Access Db с C #, и я делаю конкатенацию в SQL-запросе после предложения where, но я получаю следующую ошибку

"Синтаксическая ошибка (отсутствует оператор) в выражении запроса"

Мой код ниже

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=" + GlobalData.Email; 

Скажите, пожалуйста, что является причиной ошибки и каков правильный синтаксис для объединения.

Ответы [ 6 ]

10 голосов
/ 31 декабря 2011

Вам лучше использовать SqlParameter (более безопасный):

SqlCommand cmd = new SqlCommand("SELECT * FROM Temp1 WHERE Email LIKE @email")
cmd.Parameters.Add(new SqlParameter("email", GlobalData.Email));

Чтобы ответить на оригинальный вопрос:

Используя прямую конкатенацию, без разделителя строк, ваш запрос становится:

SELECT * FROM Temp1 WHERE Email LIKE email@email.com

вместо

SELECT * FROM Temp1 WHERE Email LIKE 'email@email.com'
5 голосов
/ 31 декабря 2011

Я думаю, что ваша проблема в пропущенных кавычках.Попробуйте это:

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + GlobalData.Email + "'"; 

Но этот метод может привести к внедрению SQL, если вы не проверите письмо.Хотя в приведенном выше коде нет ничего плохого, если данные проверены, я предпочитаю использовать параметры SQL:

SqlCommand cmd = new SqlCommand( "SELECT * FROM Temp1 WHERE Email = @Email" )
cmd.Parameters.Add( new SqlParameter( "Email" , GlobalData.Email ) );
2 голосов
/ 31 декабря 2011

У вас нет апострофов вокруг строкового литерала, поэтому ваш запрос будет выглядеть так:

Select * from TEMP1 WHERE EMAIL=someone@somesite.com

Это, конечно, приведет к синтаксической ошибке. Вам нужны апострофы вокруг строки:

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + Replace(GlobalData.Email, "'", "''") + "'";

Однако правильное кодирование строк не является тривиальным. (Вышеупомянутый метод работает для Access и Microsoft SQL Server, но для других баз данных требуются другие методы.) Вы должны использовать параметризованные запросы:

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=@email";

Затем вы добавляете параметр к объекту команды, например:

cmp.Parameters.Add("@email", DbType.VarChar, 300).Value = GlobalData.Email;
2 голосов
/ 31 декабря 2011

Попробуйте вместо этого использовать Параметризованные запросы .Обычно это норма при работе с SQL-запросами по соображениям безопасности и читабельности.

1 голос
/ 31 декабря 2011

Я не уверен насчет ошибки, но вы должны попробовать это так

cmd.CommandText = string.Format("SELECT * FROM TEMP1 WHERE EMAIL='{0}'", GlobalData.Email);

Таким образом, вам не нужно связываться с безобразной конкатенацией, которая, между прочим, занимает много памяти.

1 голос
/ 31 декабря 2011

Попробуйте что-то вроде ниже

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + GlobalData.Email + "'"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...