我有一个带有C#的Access Db,我正在sql查询后面的一个串联where子句但是我收到以下错误
“查询表达式”中的语法错误(缺少运算符)“
我的代码在
下面cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=" + GlobalData.Email;
请告诉我导致错误的原因以及连接的正确语法。
答案 0 :(得分: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@email.com
而不是
SELECT * FROM Temp1 WHERE Email LIKE 'email@email.com'
答案 1 :(得分:5)
我认为您的问题缺少引号。试试这个:
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 :(得分:2)
请尝试使用Parameterised queries。出于安全原因和可读性,这通常是使用SQL查询时的常态。
答案 3 :(得分:2)
字符串文字周围没有任何撇号,因此您的查询最终会像:
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;
答案 4 :(得分:1)
尝试以下内容
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + GlobalData.Email + "'";
答案 5 :(得分:1)
我不确定错误,但你应该像那样试试
cmd.CommandText = string.Format("SELECT * FROM TEMP1 WHERE EMAIL='{0}'", GlobalData.Email);
这样你就不需要乱用丑陋的连接,占用很多内存。