我有这个表单的SQL查询
string cmdText = "Select * from " + searchTable
+ "WHERE " + searchTable
+ "Name =' " + searchValue + "'";
Run Code Online (Sandbox Code Playgroud)
基本上我要做的是从数据库的Actors表中获取特定actor的信息.变量searchTable的值为'Actor',即表名,searchValue具有actor的名称(由Actor表中的ActorName属性表示,这里我试图通过连接单词'Actor来形成属性的名称'和'姓名')
所以,所有这些连接导致(或至少应该导致)对表单的查询:
Select * from Actor where ActorName ='some actor';
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行它时,它在浏览器中给出了错误"语法不正确'='".有人可以帮忙吗?
您可以将(并且应该!)参数放入SQL查询中,例如您的WHERE子句中的值- 但是您不能参数化诸如表名之类的内容.
所以我将该查询重写为:
SELECT (list of columns)
FROM dbo.Actor
WHERE ActorName = @ActorName
Run Code Online (Sandbox Code Playgroud)
然后传入恰好的值@ActorName.
如果您需要为导演执行相同的操作,则必须进行第二次查询
SELECT (list of columns)
FROM dbo.Directors
WHERE DirectorName = @DirectorName
Run Code Online (Sandbox Code Playgroud)
使用这样的参数
PS:您的设置中的原始问题是:您在表名的WHERE第一次出现与子句之间没有任何空格- 因此您将获得:
SELECT * FROM ActorWHERE ActorName ='.....'
Run Code Online (Sandbox Code Playgroud)
如果你真的坚持连接你的SQL语句(我不推荐它!),那么你需要在你的表名和你的名字之间加一个空格WHERE!
更新:在ADO.NET中学习参数化查询的一些资源:
您不应该将字符串连接到SQL,因为这会打开SQL注入攻击.
这是关于动态SQL的相当长的阅读,但值得阅读以了解风险和选项.
您应该使用参数化查询,但使用表名作为参数的唯一方法是使用动态SQL.
我敦促你改变你对表名的方法 - 这将导致将来出现问题 - 它是不可维护的,正如我上面提到的,可以打开你的SQL注入.
您看到的错误是您使用"Where"子句进行连接的结果 - 您在它之前缺少一个空格.您还在'以"Name"结尾的参数后面添加一个空格.
您的结果字符串,使用您的示例将是:
Select * from ActorWHERE ActorName =' some actor';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21382 次 |
| 最近记录: |