2011-12-31 2 views
3

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

«Синтаксическая ошибка (отсутствующий оператор) в выражение запроса»

Мой код ниже

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

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

ответ

10

Лучше использовать 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 protected] 

вместо

SELECT * FROM Temp1 WHERE Email LIKE '[email protected]' 
+2

Можете ли вы удалить первый? Второй - гораздо более безопасный. –

4

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

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)); 
+0

Да, строки в запросе должны быть помещены в кавычки. – Rolice

+2

Если данные поступают из пользовательского ввода (что вполне вероятно), запрос широко открыт для SQL-инъекции. – Guffa

+0

@ Guffa Одно регулярное выражение, подтверждающее действительную электронную почту, решило эту проблему. Я бы предположил, что апелляционная сторона проверяет ответ перед сохранением в БД, поскольку очень строго структурированная строка, такая как электронная инъекция, невозможна после проверки. –

1

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

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

Это доступно для SQL-инъекции. Вы должны хотя бы упомянуть об этом. –

1

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

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

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

+1

Если данные поступают из пользовательского ввода (что весьма вероятно), запрос широко открыт для SQL-инъекции. – Guffa

+0

Использование памяти было истинным (в .Net 2.0 и ранее), но теперь из-за оптимизации компилятора этот уродливый беспорядок является наиболее эффективным методом конкатенации (http://www.codeproject.com/Articles/303158/String -Concatenation-vs-Memory-Allocation-in-Cshar) –

+0

На самом деле Франсуа Б. дал вам лучший пример, чем я, используя SqlParameters намного лучше. – IamStalker

2

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

2

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

Select * from TEMP1 WHERE [email protected] 

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

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

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

cmd.CommandText = "Select * from TEMP1 WHERE [email protected]"; 

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

cmp.Parameters.Add("@email", DbType.VarChar, 300).Value = GlobalData.Email; 
Смежные вопросы