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. 关于对 maximio平台的五个常用类的初步理解及总结

    AppBean:绑定应用的默认Bean类,控制主对象集/单个对象,和ui关联的类 继承:DataBean DataBean:任何对象集/单个对象,在ui端处理类. 1.在对象层:写一个Fld类,调用构 ...

  2. JS 驗證英文字母

    //英文简介栏位焦点离开事件    function checkSummaryEN(SummaryEN) {        var val = $(SummaryEN).val();        v ...

  3. 分享一个TP5实现Create()方法的心得

    在TP5中发现用不了以前3.X的Create()方法,虽然用input更严谨,但是字段比较多的话还是有些不艺术的3.X中的实现方法如下: $Model = D('User'); $Model-> ...

  4. Windows程序设计(第五版)学习:第四章 文本输出

    第四章 文本输出 1,客户区:整个应用程序窗口中没有被标题栏.边框.菜单栏.工具栏.状态栏和滚动条占用的区域.简而言之,客户区就是窗口中程序可以在上面绘制并向用户传达可视化信息的区域.   2,大多数 ...

  5. 说一说inline-block的奇葩之处

    今天本来想聊一下margin和padding,但是当我给div加了一个display:inline-block之后,发现一个问题: .box_demo{border: 1px solid #333;w ...

  6. 用window.showModelDialog() 打开的页面的返回值

    有两个页面也个 Default1.aspx   另外一个是 Default2.aspx Default1.aspx 有个按钮是用来打开Default2.aspx页面的 按钮的js代码是 var win ...

  7. linux开机启动

    开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程.分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机 ...

  8. C#动态执行字符串(动态创建代码)

    在编写C#程序的时候,有时我们需要动态生成一些代码并执行.然而C#不像JavaScript有一个Eval函数,可以动态的执行代码.所有这些功能都要我们自己去完成.如下是实例. 动态创建代码: usin ...

  9. Cobar-Client 实现策略总结

    1. 数据源 DataSource CobarClient 的 DataSource 分为三层 ICobarDataSourceService: 封装了多个 DataSourceDescriptor, ...

  10. Oracle rowid

    本文讨论的是关于oracle从8i开始引进object的概念后的rowid,即扩展(extended)的rowid:1.rowid的介绍先对rowid有个感官认识:SQL> select ROW ...