C# 使用OracleDataAdapter的参数化查询

C# 使用OracleDataAdapter的参数化查询,c#,database,asp.net-mvc-3,oracle,C#,Database,Asp.net Mvc 3,Oracle,我目前正在将控制器类与数据访问层类(UserDAL类)结合使用,以便对数据库进行更改。但是,我知道我的代码是可攻击的,因为我没有使用参数化查询 我从示例中了解了如何使用命令对象进行查询。不过,我使用的OracleDataAdapter的行为似乎有点不同。它也与实际值不同,实际值将被参数化,如以下代码部分所示: 控制器代码,其中三个字符串由用户输入的字段填充: string usrName = mod.UserName; string role = mod.Role; string mod.act

我目前正在将控制器类与数据访问层类(UserDAL类)结合使用,以便对数据库进行更改。但是,我知道我的代码是可攻击的,因为我没有使用参数化查询

我从示例中了解了如何使用命令对象进行查询。不过,我使用的OracleDataAdapter的行为似乎有点不同。它也与实际值不同,实际值将被参数化,如以下代码部分所示:

控制器代码,其中三个字符串由用户输入的字段填充:

string usrName = mod.UserName;
string role = mod.Role;
string mod.actvInd;


string sql = "UPDATE LD_USER_ROLE" + " SET USERNAME='" + usrName + "', ROLE='" + role + "', ACTIVE_IND='" + actvInd  + "' WHERE USER_ROLE_ID=" + id + "";

UserRoleDAL udl = new UserRoleDAL();
            udl.ExecuteQuery(sql);
UserDAL类:

public class UserRoleDAL
{

    private OracleConnection conn;

    public UserRoleDAL()
    {
         string oradb = ConfigurationManager.ConnectionStrings["db_dbConnectionString"].ConnectionString;

        conn = new OracleConnection(oradb);
    }


    public void ExecuteQuery(string sql)
    {
        conn.Open();

        OracleDataAdapter adapter = new OracleDataAdapter(sql, conn);
        DataSet ds = new DataSet();
        adapter.Fill(ds);

        conn.Close();
    }
}

如何将参数化查询与OracleDataAdapter对象结合使用?我是否必须合并上述类,甚至将字段传递到UserRoleDAL对象才能这样做?

您可以将OracleDataAdapter与OracleCommand结合使用,如下所示:

public void ExecuteQuery(string usrName, string role, string activeation, int userId)
{
  string sql = "UPDATE LD_USER_ROLE SET USERNAME=:usrName, ROLE=:role, ACTIVE_IND=:actvInd  WHERE USER_ROLE_ID=:id";

    OracleCommand cmd = new OracleCommand(sql, conn);
    cmd.BindByName = true;

    cmd.Parameters.Add("usrName", usrName);
    cmd.Parameters.Add("role", role);
    cmd.Parameters.Add("actvInd", activeation);
    cmd.Parameters.Add("id", userId);

    OracleDataAdapter adapter = new OracleDataAdapter(cmd);
    DataSet ds = new DataSet();
    adapter.Fill(ds);
}

您可以将OracleDataAdapter与OracleCommand一起使用,如下所示:

public void ExecuteQuery(string usrName, string role, string activeation, int userId)
{
  string sql = "UPDATE LD_USER_ROLE SET USERNAME=:usrName, ROLE=:role, ACTIVE_IND=:actvInd  WHERE USER_ROLE_ID=:id";

    OracleCommand cmd = new OracleCommand(sql, conn);
    cmd.BindByName = true;

    cmd.Parameters.Add("usrName", usrName);
    cmd.Parameters.Add("role", role);
    cmd.Parameters.Add("actvInd", activeation);
    cmd.Parameters.Add("id", userId);

    OracleDataAdapter adapter = new OracleDataAdapter(cmd);
    DataSet ds = new DataSet();
    adapter.Fill(ds);
}

现在已经过时了,你为什么还在用它?@habib我应该用什么来代替?我正在使用ODP.NET连接到Oracle数据库。您可以使用带有参数的OracleCommand,并将其与OracleDataAdapter一起使用。我不确定OracleDataAdapter的替代品是否已经过时,为什么您仍在使用它?@habib我应该使用什么替代品?我正在使用ODP.NET连接到Oracle数据库。您可以使用带有参数的OracleCommand,并将其与OracleDataAdapter一起使用。我不确定是否需要更换OracleDataAdapter