在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();
这句话吗?
这是使用参数化查询的方法:
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注入: