在asp.net中使用SQL查询中的变量(C#)

QPT*_*PTR 6 c# sql asp.net

我有这个表单的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)

但是当我尝试运行它时,它在浏览器中给出了错误"语法不正确'='".有人可以帮忙吗?

mar*_*c_s 8

您可以将(并且应该!)参数放入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)

使用这样的参数

  • 增强安全性(禁止SQL注入攻击!)
  • 增强性能:可以缓存该查询的查询计划,并在第二次,第三次运行时重用该查询

PS:您的设置中的原始问题是:您在表名的WHERE第一次出现与子句之间没有任何空格- 因此您将获得:

SELECT * FROM ActorWHERE ActorName ='.....'
Run Code Online (Sandbox Code Playgroud)

如果你真的坚持连接你的SQL语句(我推荐它!),那么你需要在你的表名和你的名字之间加一个空格WHERE!

更新:在ADO.NET中学习参数化查询的一些资源:


Ode*_*ded 5

您不应该将字符串连接到SQL,因为这会打开SQL注入攻击.

是关于动态SQL的相当长的阅读,但值得阅读以了解风险和选项.

您应该使用参数化查询,但使用表名作为参数的唯一方法是使用动态SQL.

我敦促你改变你对表名的方法 - 这将导致将来出现问题 - 它是不可维护的,正如我上面提到的,可以打开你的SQL注入.


您看到的错误是您使用"Where"子句进行连接的结果 - 您在它之前缺少一个空格.您还在'以"Name"结尾的参数后面添加一个空格.

您的结果字符串,使用您的示例将是:

Select * from ActorWHERE ActorName =' some actor';
Run Code Online (Sandbox Code Playgroud)