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

C# 在sql语句中插入用户定义的变量,c#,sql,sql-server,sqlcommand,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 SqlComm

嗨,这是我的问题

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

此语句?

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

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

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

command.CommandText= 插入区域RegionID,RegionDescription+ 值@id,@desc; SqlParameter idParam=newSqlParameter@id,SqlDbType.Int,0; SqlParameter descParam=
刚出现的SqlParameter@desc,SqlDbType.Text,100

出于速度和安全考虑,使用参数始终是一种良好的做法。只需对代码稍作更改即可:

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

您真的不会这么做,因为这是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中使用以下值:

演示';从T_用户中删除-

完整查询变为:

SELECT * FROM T_USER WHERE Name = 'demo'; DELETE FROM T_USER--'
我们所有的记录都不见了

我们甚至可以进一步放下桌子:

queryVal需要:

演示';删除表T\u用户-


我想你明白了。有关更多信息,请在google上搜索:

尝试从直线距离中选择直线距离,其中FirstCity=+tempcityholder1++和+SecondCity=+destcity+”@rene请在回答之前仔细阅读。我不需要参数化的查询,我只需要更正this@Sahil如果您有这样的代码,那么您就很容易受到所谓的SQL注入攻击。总之,这意味着黑客可以很容易地控制你的数据库,甚至整个服务器。你确定你想要这个?rene链接的内容提供了一种更好的方法,具有相同的结果,但可以防止这种攻击。照你的方式去做,我觉得程序员不愿意学习很遗憾。再见@Sahil副本提供了完美的解决方案,当前的5个答案也是如此。不要走你显然想走的路。我已经创建了这样的当前代码\n我对你的答案有点困惑。