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);

C# ADO.NET SqlDataAdapter中传递参数的更多相关文章

  1. 关于一些url中传递参数有空格问题

    1.关于一些url中传递参数有空格问题: url.replace(/ /g, "%20") 从上面的例子中可以看到可以用:replace(/ /g, "%20" ...

  2. 【openresty】向lua代码中传递参数

    前面介绍FormInputNginxModule模块时,明白了openresty如何获取post提交的数据. 然后,如果需要通过lua处理这些数据,需要把数据作为参数传递到lua中,lua获取了这些数 ...

  3. mfc 在VC的两个对话框类中传递参数的三种方法

    弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...

  4. JQuery中如何click中传递参数

    代码如下: click(data,fn)中的data其实是json对象,取的时候,只能通过当前的事件源来取,data是默认放在event中的,所以这里的data是eventdata,引用的时候也使用e ...

  5. Struct2 向Action中传递参数(中文乱码问题)

    就是把视图上的值传递到Action定义的方法中 也就是把数据从前台传递到后台 三种方式: 1.  使用action属性接收参数 比如jsp页面: <body> 使用action属性接收参数 ...

  6. ASP.net button类控件click事件中传递参数

    单击Button会同时触发这两个事件,但先执行Click,后执行Command,在button控件中加上参数属性 CommandArgument='' 在click响应函数中可以用以下代码获得传递的参 ...

  7. sys.argv向脚本中传递参数

    可以向脚本中传递无限多个参数,其值是一个列表,默认sys.argv[0]内容是脚本文件路径加文件名 test.py文件中的内容如下: #! /usr/bin/python3import sys pri ...

  8. URL中传递参数给视图函数

    1. 采用在url中使用变量的方式: 在path的第一个参数中,使用<参数名>的方式可以传递参数.然后在视图函数中也要写一个参数,视图函数中的参数必须和url中的参数名称保持一致,不然就找 ...

  9. JSF在ui:include中传递参数到对应控制层

    在JSF中使用ui:include方法可以引入一个页面到当前页面中,如果要向被包含的页面中传入参数,可以使用ui:param标签,这个标签类似于f:param,只不过一个用于页面,一个用于实际标签.示 ...

随机推荐

  1. 判断 0 和 '' 以及 empty null false的关系

    if('safdasefasefasf'==0) { echo "该字符串转换为数字 等于 0 <br/>"; } //output:该字符串转换为数字 等于零. 这是 ...

  2. 银行ATM机工作流程模拟编程

    [编程内容] 编程,模拟一个ATM(Automatic Teller Machine,自动取款机)的工作流程.依据帐户信息:姓名.帐号.密码.余额,完成ATM机功能:登录.显示余额.取款.修改密码. ...

  3. CAP理论(转)

    add by zhj: CAP理论可以简单的理解为一致性,可用性,可分区性,这三者没有办法同时满足.我们使用的关系型数据库,比如MySQL,Postgresql是CA类型, 而Redis,MongoD ...

  4. Linux_04------Linux权限的设定

    三种权限 */ /** * 修改文件所有者 * chown 用户名 文件名 */

  5. LeetCode OJ 331. Verify Preorder Serialization of a Binary Tree

    One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...

  6. JS之延迟处理

    $(document).ready(function () { $("#zidong3,#zidong1").click(function () { $("#zidong ...

  7. 亿级Web系统的高容错性实践

    亿级Web系统的高容错性实践 背景介绍 大概三年前,我在腾讯负责的活动运营系统,因为业务流量规模的数倍增长,系统出现了各种各样的异常,当时,作为开发的我,7*24小时地没日没夜处理告警,周末和凌晨也经 ...

  8. LeetCode(一)

    数据流的中位数 class MedianFinder { private Queue<Integer> maxHeap = new PriorityQueue(new Comparator ...

  9. oracle中的数据对象

    oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(1 ...

  10. MySQL数据库指定字符集

    mysql 创建数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题. 我们遵循的标准是,数据库,表,字段和页面或文本的编 ...