嗨,这是我的查询
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();
这句话?
答案 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: