我有一个Access数据库与C#和我做在SQL查询aftere where子句,但我收到以下错误串联在C#中使用SQL查询的Access数据库
“语法错误(缺少操作员)的串联查询表达式”
我的代码如下
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=" + GlobalData.Email;
请告诉我是什么原因造成的错误,什么正确的语法是串联。
我有一个Access数据库与C#和我做在SQL查询aftere where子句,但我收到以下错误串联在C#中使用SQL查询的Access数据库
“语法错误(缺少操作员)的串联查询表达式”
我的代码如下
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=" + GlobalData.Email;
请告诉我是什么原因造成的错误,什么正确的语法是串联。
你最好使用的SqlParameter(更安全):
SqlCommand cmd = new SqlCommand("SELECT * FROM Temp1 WHERE Email LIKE @email")
cmd.Parameters.Add(new SqlParameter("email", GlobalData.Email));
要回答原来的问题:
使用直接CON连环,不字符串分隔符,查询变成:
SELECT * FROM Temp1 WHERE Email LIKE [email protected]
,而不是
SELECT * FROM Temp1 WHERE Email LIKE '[email protected]'
我认为你的问题缺少引号。试试这个:
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));
尝试类似下面
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + GlobalData.Email + "'";
这是开放给SQL注入。你至少应该提到这一点。 – 2011-12-31 13:32:05
我不知道有关的错误,但你应该尝试一下这样的
cmd.CommandText = string.Format("SELECT * FROM TEMP1 WHERE EMAIL='{0}'", GlobalData.Email);
这样,你就不需要混淆丑陋的concatination,这需要大量的内存使用。
如果数据来自用户输入(很有可能),那么SQL注入的查询就会打开。 – Guffa 2011-12-31 13:35:27
内存使用情况曾经是真实的(在.Net 2.0和更早版本中),但现在,由于编译器优化,丑陋的混乱是最有效的串联方法(http://www.codeproject.com/Articles/303158/String -Concatenation-vs-Memory-Allocation-in-Cshar) – 2011-12-31 13:37:16
实际上,Francois B.给了你一个比我更好的例子,使用SqlParameters要好得多。 – IamStalker 2011-12-31 13:39:18
请尝试使用Parameterised queries代替。出于安全性以及可读性的原因,使用SQL查询通常是常见的。
您不必字符串文字周围的单引号,这样你的查询会落得像:
Select * from TEMP1 WHERE [email protected]
这当然会导致一个语法错误。您需要撇号串绕:
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + Replace(GlobalData.Email, "'", "''") + "'";
然而,编码字符串正确是不平凡的。 (以上方法适用于Access和Microsoft SQL Server中,但是其他的数据库需要其他的方法。)你还是使用parametrised查询:
cmd.CommandText = "Select * from TEMP1 WHERE [email protected]";
然后你一个参数添加到命令对象,例如:
cmp.Parameters.Add("@email", DbType.VarChar, 300).Value = GlobalData.Email;
你可以删除第一个吗?第二个更安全。 – 2011-12-31 13:34:50