【问题标题】:Insert user defined variables in to the sql statements [duplicate]将用户定义的变量插入到 sql 语句中[重复]
【发布时间】:2014-07-03 07:36:26
【问题描述】:

您好,这是我的问题

    SELECT StraightDist FROM StraightLineDistances
  WHERE (FirstCity='007' AND SecondCity='017');

如何将其传递给 sql 语句? 我想用变量替换城市编号“007”和“017”

     string destcity;
     string tempcityholder1;

我试过的是这个

          SqlCommand mybtncmd2 = new SqlCommand("SELECT StraightDist FROM StraightLineDistances WHERE (FirstCity='" + tempcityholder1 + "' AND SecondCity='" + destcity + "');", mybtnconn2); 

它没有给我预期的输出。

但是当我尝试使用下面给出的原始 sql 时,它起作用了。

    SqlCommand mybtncmd2 = new SqlCommand("SELECT StraightDist FROM StraightLineDistances WHERE (FirstCity='007' AND SecondCity='017');", mybtnconn2);

谁能指出这里的错误? 或更好的解决方案。 这是针对个人应用程序,安全性不是必须的,因此不需要参数化查询。而且我不知道如何使用多个参数实现参数化查询。如果有人可以解释如何使用参数化查询,那就太好了,我将非常感激。但就目前而言,我需要更正这一点。

任何帮助都会很棒..

如果使用参数化查询,则确定

我的作品是这样的

           SqlConnection mybtnconn2 = null;
                SqlDataReader mybtnreader2 = null;
                mybtnconn2 = new SqlConnection("");
                mybtnconn2.Open();

                SqlCommand mybtncmd2 = new SqlCommand("SELECT StraightDist FROM    StraightLineDistances WHERE (FirstCity='007' AND SecondCity='017');", mybtnconn2);



                mybtnreader2 = mybtncmd2.ExecuteReader();
                while (mybtnreader2.Read())
                {
                    MessageBox.Show(mybtnreader2.GetValue(0) + "My btn readre 2 value");

                }

谁能给我一个不会使这种结构复杂化的解决方案。 如果我使用参数化查询,我该如何编辑

 mybtnreader2 = mybtncmd2.ExecuteReader();

这个说法?

【问题讨论】:

  • 试试这个 SELECT StraightDist FROM StraightLineDistances WHERE (FirstCity='''' + tempcityholder1 + ''''+ AND +''''SecondCity='''' + destcity + "')跨度>
  • @rene 请在回答前完整阅读。我不需要参数化查询我只需要更正这个
  • @Sahil 如果您有这样的代码,那么您很容易受到所谓的 SQL 注入攻击。归根结底,这意味着黑客可以轻松控制您的数据库,甚至可能控制您的整个服务器。你确定要这个? rene 所链接的内容提供了一种具有相同结果的更好方法,但可以防止这种攻击。
  • 随心所欲,我很遗憾程序员不愿意学习。再见!
  • @Sahil 副本提供了完美的解决方案,5 个当前答案也是如此。不要走你明显想走的路。

标签: c# sql sql-server sqlcommand


【解决方案1】:

这是使用参数化查询的方式:

  string sqlQuery="SELECT StraightDist FROM StraightLineDistances WHERE (FirstCity= @tempcityholder1 AND SecondCity=@destcity);"

     SqlCommand mybtncmd2 = new SqlCommand(sqlQuery, mybtnconn2);

    mybtncmd2.Parameters.AddWithValue("tempcityholder1", tempcityholder1 );
    mybtncmd2.Parameters.AddWithValue("destcity", destcity);

【讨论】:

  • 我已经创建了这样的当前代码\我对你的回答有点困惑。
【解决方案2】:

为了速度和安全性,使用参数总是好的做法。只需对代码稍作改动即可:

var mybtncmd2 = new SqlCommand("SELECT StraightDist FROM StraightLineDistances WHERE FirstCity=@City1 AND SecondCity=@City2;", mybtnconn2);
mybtncmd2.Parameters.AddWithValue("@City1", "007");
mybtncmd2.Parameters.AddWithValue("@City2", "017");

【讨论】:

    【解决方案3】:

    使用准备好的语句:既简单又安全。

    command.CommandText = "INSERT INTO Region (RegionID, RegionDescription) " + "VALUES (@id, @desc)"; SqlParameter idParam = new SqlParameter("@id", SqlDbType.Int, 0); SqlParameter descParam = new SqlParameter("@desc", SqlDbType.Text, 100);

    【讨论】:

      【解决方案4】:

      你真的不会这样做,因为这是 SQL 注入的大门。 相反,您应该使用存储过程来实现该方法。

      如果你不熟悉 SQL 注入,让我们说清楚:

      假设您有一个数据库,其中包含一个名为“T_USER”的表,其中包含 10 条记录。 用户对象有一个 Id、一个 Name 和一个 Firstname。

      现在,让我们编写一个根据用户名选择用户的查询。

      SELECT * FROM T_USER WHERE Name= 'Name 1'
      

      如果我们从 C# 中获取该值,这确实会产生意想不到的行为。

      所以,在 C# 代码中我们会有一个查询:

      string queryVal;
      var command = "SELECT * FROM T_USER WHERE Name = '" + queryVal + "'";
      

      只要用户对您的应用程序友好,就没有问题。 但是有一种简单的方法可以检索此表中的所有记录。

      如果我们的用户在 QueryVal 中传递以下字符串:

      demo' OR 'a' = 'a

      那么我们的查询会变成:

      SELECT * FROM T_USER WHERE Name = 'demo' OR 'a' = 'a'
      

      由于第二个条件始终为真,因此从该表中检索所有记录。 但我们甚至可以更进一步:

      如果同一用户在queryVal中使用以下值:

      演示';从 T_USER 中删除--

      完整的查询变成:

      SELECT * FROM T_USER WHERE Name = 'demo'; DELETE FROM T_USER--'
      

      我们所有的记录都消失了。

      我们甚至可以通过删除表格来更进一步:

      queryVal 需要:

      演示'; DROP TABLE T_USER--

      我想你明白了。有关更多信息,请访问Sql Injection 谷歌:

      【讨论】:

        猜你喜欢
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        • 2014-06-30
        • 2017-05-13
        相关资源
        最近更新 更多