没有给出一个或多个所需参数的值

时间:2015-04-29 02:32:34

标签: c# sql ms-access sql-injection

我试图阻止SQL注入。我这样做了吗? (我使用MS Access。)我还应该使用sqlparameter吗?

OleDbParameter[] myparm = new OleDbParameter[2];
myparm[0] = new OleDbParameter("@UserID", UserName.Text);
myparm[1] = new OleDbParameter("@Password", encode);

string queryStr = "SELECT * FROM TMUser WHERE UserID=@UserID AND Password=@Password";

OleDbConnection conn = new OleDbConnection(_connStr);
OleDbCommand cmd = new OleDbCommand(queryStr, conn);

conn.Open();
OleDbDataReader dr = cmd.ExecuteReader();

1 个答案:

答案 0 :(得分:1)

关闭!

string queryStr = "SELECT * FROM TMUser WHERE UserID=@UserID AND Password=@Password";

OleDbConnection conn = new OleDbConnection(_connStr);
OleDbCommand cmd = new OleDbCommand(queryStr, conn);
cmd.Parameters.AddWithValue("@UserID", UserName.Text);
cmd.Parameters.AddWithValue("@Password", encode);

参数是命令对象的一部分,您可以使用Parameters.AddWithValue方法将参数值设置为您在查询字符串中定义的值。

顺便说一下,你应该使用using语句来封装你的一些对象,这是我通常做的事情:

using (OleDbConnection conn = new OleDbConnection(_connStr))
using (OleDbCommand = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "SELECT ...";
    cmd.Parameters.AddWithValue(...);

    cmd.ExecuteReader();
    //...
}

这样,如果内部出现问题或者在完成连接后关闭连接,您就不必担心清理资源。

相关问题