• C# ADO.NET SqlDataAdapter中传递参数


    ADO.NET的SQL语句中,往往不是静态的语句,而是需要接受传递过来的参数,比如典型的登录功能,需要查找指定的用户名:

    string sqlQuery = "SELECT * FROM W_User WHERE UserName = '" + userName + "'";

    上例中userName就是传递过来的用户名参数,这个参数可能来自于Windows表单,也可能来自于Web页面的文本框。但上面的代码的应用方式,在实际应用是需要绝对禁止的,因为有可能被黑客利用,写上恶意代码,用来破解数据库,即所谓SQL注入。

    因此,实际应用中,需要使用添加参数的方式完成任务,从而避免SQL注入。比如下面的办法:

                string sqlQuery = "SELECT * FROM W_User";
                sqlQuery += " WHERE UserName = @userName";  //声明形式参数@userName
                SqlCommand comm = new SqlCommand(sqlQuery, conn);   //创建SqlCommand对象
                comm.Parameters.AddWithValue("@userName", userName);  //将实际参数userName传递给SqlCommand对象(comm)的形式参数@userName
                conn.Open();
                SqlDataReader dr = comm.ExecuteReader();

    上述代码中,使用@userName作为形式参数,其中@是形式参数的前缀,后跟实际参数名称。

    对于SqlDataAdapter来说,一般是这样使用的,

                string sqlQuery = "SELECT * FROM W_User";
                SqlDataAdapter da = new SqlDataAdapter(sqlQuery, conn);  
                DataSet ds = new DataSet();
                da.Fill(ds);

    由于这里没有出现SqlCommand对象,因此无法利用SqlCommand对象的参数传递方式完成SqlDataAdapter对象的传递参数,但实际应用中,SqlDataAdapter也需要进行参数传递,问题如何解决呢?

    解决办法是:首先创建SqlCommand对象,并在该对象中传递参数,然后再创建SqlDataAdapter对象,设置其SelectCommand(或InsertCommand, DeleteCommand, UpdateCommand)属性值即可,如下面代码:

                    string sqlQuery;
    
                    sqlQuery = "SELECT * FROM W_User";
                    sqlQuery += " WHERE UserName = @userName";
                    
                    //SqlDataAdapter利用SqlCommand传递参数
                    SqlCommand comm = new SqlCommand(sqlQuery, Conn);
                    comm.Parameters.AddWithValue("@userName", userName);
                    
                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = comm;
    
                    DataSet ds = new DataSet();
                    da.Fill(ds);

    这样的情况下,SqlDataAdapter对象就可以接受传递参数了。

    当然,也可以直接对SqlDataAdapter对象进行传递参数,注意与相应的命令对应(即SelectCommand,InsertCommand, UpdateCommand, DeleteCommand),比如下面的代码,没有使用SqlCommand对象传递参数,而是对SqlDataAdapter对象da使用了 da.SelectCommand.Parameters.AddWithValue()进行,如果对比上一个代码段,可以看出,这里的da.SelectCommand替代了上一个代码段中的SqlCommand对象comm

                    string sqlQuery;
    
                    sqlQuery = "SELECT * FROM W_User";
                    sqlQuery += " WHERE UserName = @userName";
                    
                    //DataAdapter利用SqlCommand传递参数
                    //SqlCommand comm = new SqlCommand(sqlQuery, conn);
                    //comm.Parameters.AddWithValue("@userName", userName);
                    
                    SqlDataAdapter da = new SqlDataAdapter(sqlQuery, conn);
                    //直接使用DataAdapter传递参数
                    da.SelectCommand.Parameters.AddWithValue("@userName", userName);
    
                    DataSet ds = new DataSet();
                    da.Fill(ds);
  • 相关阅读:
    流媒体技术原理及播放方式(浅显易懂)
    实时音视频技术难点及解决方案
    流媒体技术简介
    DSP广告系统架构及关键技术解析(转)
    大型网站架构 图片服务器分离
    大话铁道部12306订票系统云架构
    技术揭秘12306改造(一):尖峰日PV值297亿下可每秒出票1032张
    12306火车票预定系统的需求分析
    PowerDesigner16.5 使用遇到的问题
    Ubuntu不输入密码执行sudo命令方法介绍
  • 原文地址:https://www.cnblogs.com/wusir/p/3545867.html
Copyright © 2020-2023  润新知