网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > ADO.NET > ADO.NET参数详解  

ADO.NET参数详解

2008-04-24  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

    这个问题以前总是遇到,但是每次都是找到解决方法就没有具体找原因。昨天再次遇到参数问题,才想着一定要搞清楚了。
    ADO.NET中不同数据提供者所用参数格式如下:
    Provider             Named/Positional            Parameter Marker
    SqlClient            Named                       @parmname
    OracleClient         Named                       parmname (or parmname)
    OleDb                Positional                  ? 网管联盟bitsCN_com
    Odbc                 Positional                   ?

网管u家u.bitsCN.com

    在DbCommand.CommandType=CommandType.Text时,DbParameter就要符合上述要求。如SqlParameter则要使用参数名来决定参数值,而oledb则是根据参数顺序来决定参数值。但是当DbCommand.CommandType=CommandType.StoreProcedure时,则可以采用采用占位符或名字来确定参数值。
    这种不统一使得要写出跨越各种数据提供者的程序变得复杂了。同时要实现统一的数据层当然还要考虑不同数据库的sql语句区别(所以要尽量采用标准的sql语句)。本来ADO.net提供了很好的类结构(DbConnection, DbCommand等以Db开头的类)来实现这种很重要的功能,可是这些原因使得我们还是要自己写不少代码。
    下面是一段示例代码:

中国网管论坛bbs.bitsCN.com

    //create proc TestParam
    //@courseid varchar(50)
    //as
    //select * from course where courseid=@courseid

中国网管联盟bitsCN.com

    using System;
    using System.Collections.Generic;
    using System.Data.Common;
    using System.Data.OleDb;
    using System.Data.SqlClient;
    using System.Text; 网管论坛bbs_bitsCN_com

    namespace ADOParameterTest
    ...{
        class Program
        ...{
            enum ConnectionType : byte ...{ Sql, Ole }; 中国网管论坛bbs.bitsCN.com

        static string sqlConnectionString = "Data Source=CTEC-LLY;Initial Catalog=examdb;Integrated Security=True";
        static string oleConnectionString = "Provider=sqloledb;Data Source=CTEC-LLY;Initial Catalog=examdb;User Id=sa;Password=sa"; 中国网管联盟bitsCN.com

        static DbConnection GetConnection(ConnectionType ct)...{
            if (ct == ConnectionType.Sql)
           
            ...{
                return new SqlConnection(sqlConnectionString);
            }
            else
            ...{
                return new OleDbConnection(oleConnectionString);
            }
        } 网管联盟bitsCN_com

        static void TestOleCommandText()
        ...{
            Console.WriteLine("TestOleCommandText");
            using(DbConnection con = GetConnection(ConnectionType.Ole))
            ...{
                con.Open();
                DbCommand cmd = con.CreateCommand();
                //cmd.CommandText = "declare @courseid as varchar(50); set @courseid=’0001’;select * from course where courseid=@courseid";
                cmd.CommandText = "select * from course where courseid=?";

网管bitscn_com


                //odbc&oledb只能是?做占位符,这时跟参数名无关跟参数顺序是相关的
                DbParameter p = cmd.CreateParameter();
                p.ParameterName = "courseid";
                p.Value = "0001";
                cmd.Parameters.Add(p);
                //下面被注释的参数设置方式也是对的,可以注释上面四行而采用下面的语句
                //记住参数名是没有意义的,顺序决定参数
                //cmd.Parameters.Add(new OleDbParameter("@courseid", "0001"));
网管网www_bitscn_com

                ShowResult(cmd.ExecuteReader());
            }
        }

网管网www_bitscn_com

        static void TestOleStoredProcedure()
       
         ...{
            Console.WriteLine("TestOleStoredProcedure");
            using (DbConnection con = GetConnection(ConnectionType.Ole))
            ...{
                con.Open();
                DbCommand cmd = con.CreateCommand();
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandText = "TestParam"; 网管bitscn_com
                Console.WriteLine("用@param做占位符");
                //odbc&oledb只能是?做占位符,这时跟参数名无关跟参数顺序是相关的
                DbParameter p = cmd.CreateParameter();
                p.ParameterName = "@courseid";
                p.Value = "0001";
                cmd.Parameters.Add(p);
                //下面被注释的参数设置方式也是对的,可以注释上面四行而采用下面的语句
                //记住参数名是没有意义的,顺序决定参数

网管bitscn_com


                //cmd.Parameters.Add(new OleDbParameter("@courseid", "0001"));
                ShowResult(cmd.ExecuteReader()); 网管u家u.bitsCN.com

                Console.WriteLine("用?做占位符");
                p.ParameterName = "";
                ShowResult(cmd.ExecuteReader()); 网管bitscn_com

            }
        }

网管网www.bitscn.com

网管网www_bitscn_com


TAGs   详解   参数       ...   Console.WriteLine   @courseid   顺序      
 上一篇:ado extentsion绑定recordset冗余变量问题   下一篇:ADO.NET 数据库访问之数据分页
ADO.NET参数详解 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: