【发布时间】:2012-01-31 01:56:23
【问题描述】:
我有一个带有 C# 的 Access Db,我在 where 子句之后的 sql 查询中进行连接,但出现以下错误
“查询表达式中的语法错误(缺少运算符)”
我的代码在下面
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=" + GlobalData.Email;
请告诉我是什么导致了错误以及连接的正确语法是什么。
【问题讨论】:
我有一个带有 C# 的 Access Db,我在 where 子句之后的 sql 查询中进行连接,但出现以下错误
“查询表达式中的语法错误(缺少运算符)”
我的代码在下面
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));
回答原来的问题:
使用直接连接,没有字符串分隔符,你的查询变成:
SELECT * FROM Temp1 WHERE Email LIKE email@email.com
而不是
SELECT * FROM Temp1 WHERE Email LIKE 'email@email.com'
【讨论】:
我认为您的问题是缺少引号。试试这个:
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 ) );
【讨论】:
尝试改用Parameterised queries。出于安全原因和可读性考虑,这通常是处理 SQL 查询时的常态。
【讨论】:
字符串文字周围没有任何撇号,因此您的查询最终会像:
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;
【讨论】:
试试下面的方法
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + GlobalData.Email + "'";
【讨论】:
我不确定这个错误,但你应该这样尝试
cmd.CommandText = string.Format("SELECT * FROM TEMP1 WHERE EMAIL='{0}'", GlobalData.Email);
这样你就不需要弄乱丑陋的连接,顺便说一句,占用大量内存。
【讨论】: