将用户定义的变量插入到sql语句中

时间:2014-07-03 07:36:27

标签: c# sql sql-server sqlcommand

嗨,这是我的查询

    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();

这句话?

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

使用准备好的陈述:既简单又安全。

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);

答案 2 :(得分:0)

在速度和安全性方面,使用参数总是很好的做法。只需对代码稍作修改即可:

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 :(得分:0)

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

如果你不熟悉SQL注入,请让它说清楚:

假设您有一个数据库,其中包含一个名为' T_USER'里面有10条记录。 用户对象具有Id,名称和名字。

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

SELECT * FROM T_USER WHERE Name= 'Name 1'

如果我们从C#中获取该值,则可能会出现意外行为。

因此,在C#代码中,我们将有一个查询:

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

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

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

  

演示'或者' a' =' a

然后我们的查询将成为:

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

由于第二个条件始终为true,因此将从此表中检索所有记录。 但我们甚至可以走得更远:

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

  

演示&#39 ;;从T_USER删除 -

完整查询变为:

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

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

我们甚至可以通过放弃表格来进一步:

queryVal需要是:

  

演示&#39 ;; DROP TABLE T_USER -

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