2011-12-31 80 views
3

我有一个Access数据库与C#和我做在SQL查询aftere where子句,但我收到以下错误串联在C#中使用SQL查询的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)); 

要回答原来的问题:

使用直接CON连环,不字符串分隔符,查询变成:

SELECT * FROM Temp1 WHERE Email LIKE [email protected] 

,而不是

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

你可以删除第一个吗?第二个更安全。 – 2011-12-31 13:34:50

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 2011-12-31 13:30:25

+2

如果数据来自用户输入(很有可能),那么SQL注入的查询就会打开。 – Guffa 2011-12-31 13:35:02

+0

@Guffa验证有效邮件的正则表达式解决了这个问题。我会假定提交者在保存到数据库之前验证响应,因为验证后不能使用电子邮件注入等非常结构化的字符串。 – 2011-12-31 13:39:52

1

尝试类似下面

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

这是开放给SQL注入。你至少应该提到这一点。 – 2011-12-31 13:32:05

1

我不知道有关的错误,但你应该尝试一下这样的

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

这样,你就不需要混淆丑陋的concatination,这需要大量的内存使用。

+1

如果数据来自用户输入(很有可能),那么SQL注入的查询就会打开。 – Guffa 2011-12-31 13:35:27

+0

内存使用情况曾经是真实的(在.Net 2.0和更早版本中),但现在,由于编译器优化,丑陋的混乱是最有效的串联方法(http://www.codeproject.com/Articles/303158/String -Concatenation-vs-Memory-Allocation-in-Cshar) – 2011-12-31 13:37:16

+0

实际上,Francois B.给了你一个比我更好的例子,使用SqlParameters要好得多。 – IamStalker 2011-12-31 13:39:18

2

请尝试使用Parameterised queries代替。出于安全性以及可读性的原因,使用SQL查询通常是常见的。

2

您不必字符串文字周围的单引号,这样你的查询会落得像:

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;