【问题标题】:Using variables in SQL queries in asp.net (C#)在 asp.net (C#) 中的 SQL 查询中使用变量
【发布时间】:2011-05-02 05:16:09
【问题描述】:

我有一个这种形式的 SQL 查询

string cmdText = "Select * from " + searchTable 
  + "WHERE " + searchTable 
  + "Name =' " +   searchValue + "'";

基本上我要做的是从数据库的 Actors 表中获取特定演员的信息。变量 searchTable 的值为“Actor”,它是表名,searchValue 有演员的名字(由演员表中的 ActorName 属性表示,这里我试图通过连接单词“Actor”来形成属性的名称'和'名称')

因此,所有这些连接都会导致(或至少应该导致)以下形式的查询:

Select * from Actor where ActorName ='some actor';

但是当我尝试运行它时,它会在浏览器中显示错误“'=' 附近的语法不正确”。有人可以帮忙吗?

【问题讨论】:

    标签: c# asp.net sql


    【解决方案1】:

    您可以将(并且应该!)参数放入您的 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 中参数化查询的资源:

    【讨论】:

    • 感谢您的详细回复,我对asp.net和c#非常陌生,我们的导师刚刚与我们进行了串联。也就是说,我很想了解更多关于参数化查询的信息,我用谷歌搜索了它,但找不到任何令人满意的介绍,有代码示例的东西,有没有你可以指导我的链接?无论如何,非常感谢您的帮助!
    • @QPTR:添加了一些资源链接
    【解决方案2】:

    您不应该将字符串连接到 SQL,因为这会打开您到SQL Injection attacks

    This 是一篇关于动态 SQL 的相当长的读物,但值得一读以了解风险和选项。

    您应该改用parameterized queries,尽管使用表名作为参数的唯一方法是使用动态 SQL。

    我敦促您更改有关表名的方法 - 这将在未来导致问题 - 它不可维护,正如我上面提到的,可能会使您面临 SQL 注入。


    您看到的错误是您使用“Where”子句进行连接的结果 - 您在它之前缺少一个空格。您还在以“名称”结尾的参数中的' 之后添加一个空格。

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

    Select * from ActorWHERE ActorName =' some actor';
    

    【讨论】:

    • 感谢您的链接!我会尝试使用它们。
    【解决方案3】:

    有一个空白缺失,一个太多:

    searchTable + "Name =' "
    

    应该阅读

    searchTable + " Name ='"
    

    除此之外,使用 SQL 参数来防止 SQL 注入。

    【讨论】:

    • 感谢您的回复,我没有注意到空格,现在可以了。
    【解决方案4】:
    string cmdText = "Select * from " + searchTable + " WHERE Name = '" +   searchValue + "'";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多