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

本文关键字:定义 变量 用户 插入 sql 语句 | 更新日期: 2023-09-27 18:11: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);
谁能指出我这里的错误?或者更好的解决方案。这是针对个人应用程序的,安全性不是必须的,因此不需要参数化查询。我不知道如何用多个参数实现参数化查询。如果有人能解释如何使用参数化查询,那就太好了,我真的很感激。但就目前而言,我需要纠正这一点。

任何帮助都会很好。

使用参数化查询

MY Work look like this

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

这句话吗?

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

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

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

对于速度和安全性来说,使用参数始终是一种很好的做法。您只需要稍微修改一下代码:

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

使用预处理语句:既简单又安全。

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

您真的不会这样做,因为这是打开SQL注入的大门。对于这种方法,您应该使用存储过程。

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

假设您有一个数据库,其中有一个名为'T_USER'的表,其中有10条记录。user对象有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中使用了以下值:

演示";DELETE FROM T_USER——

完整的查询变成:

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

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

我们甚至可以更进一步,把表去掉:

queryVal需要为:

演示";删除表T_USER——

我想你明白了。要了解更多信息,谷歌Sql注入: