我有一个这种形式的SQL查询
string cmdText = "Select * from " + searchTable
+ "WHERE " + searchTable
+ "Name =' " + searchValue + "'";
基本上我要做的是从数据库的Actors表中获取特定actor的信息。变量searchTable的值为'Actor',即表名,searchValue具有actor的名称(由Actor表中的ActorName属性表示,这里我试图通过连接单词'Actor来形成属性的名称'和'姓名')
所以,所有这些连接导致(或至少应该导致)对表单的查询:
Select * from Actor where ActorName ='some actor';
但是当我尝试运行它时,它在浏览器中给出了“错误的语法'=''”错误。有人可以帮忙吗?
答案 0 :(得分:8)
您可以将(和应该!)参数放入SQL查询中以获取例如您的WHERE
条款 - 但无法参数化类似于您的表名的内容。
所以我将该查询重写为:
SELECT (list of columns)
FROM dbo.Actor
WHERE ActorName = @ActorName
然后传入@ActorName
的值。
如果你需要为导演做同样的事情,你必须有第二个查询
SELECT (list of columns)
FROM dbo.Directors
WHERE DirectorName = @DirectorName
使用这样的参数
PS:您的设置中的原始问题是:您在表名的第一次出现和WHERE
子句之间没有任何空格 - 因此您会得到:
SELECT * FROM ActorWHERE ActorName ='.....'
如果你真的坚持将你的SQL语句连接在一起(我会不推荐它!),那么你需要在表名和WHERE
之间加一个空格!
更新:了解ADO.NET中参数化查询的一些资源:
答案 1 :(得分:5)
您不应该将字符串连接到SQL,因为这会打开您最多SQL Injection attacks。
This是关于动态SQL的相当长的阅读,但值得阅读以了解风险和选项。
您应该使用parameterized queries,但使用表名作为参数的唯一方法是使用动态SQL。
我建议你改变你对表名的处理方法 - 这将导致将来出现问题 - 它不可维护,正如我上面提到的,可以打开你的SQL注入。
您看到的错误是您使用“Where”子句进行连接的结果 - 您之前缺少一个空格。您还在以“名称”结尾的参数中的'
之后添加空格。
您的结果字符串,使用您的示例:
Select * from ActorWHERE ActorName =' some actor';
答案 2 :(得分:1)
缺少一个空白而且太多了:
searchTable + "Name =' "
应该阅读
searchTable + " Name ='"
除此之外,使用SQL参数来防止SQL注入。
答案 3 :(得分:-1)
string cmdText = "Select * from " + searchTable + " WHERE Name = '" + searchValue + "'";