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

时间:2011-05-02 05:16:10

标签: c# asp.net sql

我有一个这种形式的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';

但是当我尝试运行它时,它在浏览器中给出了“错误的语法'=''”错误。有人可以帮忙吗?

4 个答案:

答案 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

使用这样的参数

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

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 + "'";