云中客

梦想有多大,就能走多远

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

     我们都知道,只要涉及到数据库的程序。避免不了与数据库交互,执行带参数的存储过程和Sql等。

自然而然我们就会想“用ODP,OLE DB等这些数据提供程序要怎么写才能与数据库友好交互呢?”。以

下我就针对不同的参数传递方法做了一定的总结,有问题的地方希望大家指正。

     1,OLE DB Sql的参数传递方法

     2,MSDAORA Sql的参数传递方法

     3,ODP Sql的参数传递方法

     4,使用带参sql的好处及效率

 

                                         OLE DB Sql的参数传递方法

    引用MSDN:OLE DB 是用于访问数据的基于 COM 的应用程序编程接口 (API)。OLE DB 支持访问

以 OLE DB 提供程序可以使用的任何格式(数据库、电子表格、文本文件等)存储的数据。每个 OLE DB

提供程序从某一特定类型的数据源(例如 SQL Server 数据库、Microsoft Access 数据库或 Microsoft

Excel 电子表格)公开数据。

   主要用到的System.Data.OleDb命名空间为 OLE DB .NET Framework数据提供程序。先看如下

两句Sql:

INSERT INTO TS_ITEM(ITEM_CD) VALUES(?)
SELECT ITEM_CD  FROM TS_ITEM WHERE ITEM_CD BETWEEN ? AND ?

   上面Sql明显的特点是出现了【?】,这就是OLE DB带参Sql的一种写法。Sql解析时,会从传入的参数

集合OleDbParameters中取值。取值顺序:OleDbParameters索引从小到大。

   注意点:1,参数类型,参数个数,参数顺序一定要和表定义的一致。

        2,如果是Oracle数据库,参数类型是对不上的。只能用替代类型,如:Varchar2<=>Varchar,

          Number<=>Integer等等,这必须依据实际数据类型的长度做选择。

 应用举例:

 1         /// <summary>
 2         /// 参数追加
 3         /// </summary>
 4         /// <param name="valName"> 参数名</param>
 5         /// <param name="var">参数値</param>
 6         /// <param name="valType">数据类型</param>
 7         public static void AddDbParameter(string valName, object var, OleDbType valType)
 8         {
 9             OleDbParameter p = new OleDbParameter();
10             p.ParameterName = valName;
11             p.Direction = ParameterDirection.Input;
12             p.OleDbType = valType;
13             p.IsNullable = true;
14             p.Value = var;
15             oleDbCommand.Parameters.Add(p);
16         }

 

 1         /// <summary>
 2         /// 数据取得
 3         /// </summary>
 4         /// <param name="i_ItemFrom">項目From</param>
 5         /// <param name="i_ItemTO">項目To</param>
 6         /// <returns></returns>
 7         public static DataTable GetData(string i_ItemFrom, string i_ItemTO)
 8         {
 9             OleParModel.PreProcess();
10             OleParModel.PrepareDbSql(“SELECT ITEM_CD  FROM TS_ITEM WHERE ITEM_CD BETWEEN ? AND ?”); 
11           OleParModel.AddDbParameter("ITEMFROM",i_ItemFrom,OleDbType.VarChar);
12            OleParModel.AddDbParameter("ITEMTO", i_ItemTO, OleDbType.VarChar);
13
14            return OleParModel.GetDataSet("M_ITEM").Tables[0];
15       }

    存储过程也是如此使用,只是CommandType不一样而已。

oleDbCommand.CommandType = CommandType.StoredProcedure;

    优点:在缓存没清除的情况下,此Sql数据库只需解析一次,再次执行此Sql时速度将更快。

    缺点:1,当参数比较多的时候,很难一下区分出【?】所对应的参数。

              2,有些数据库,数据类型对不上,在编程的时候得斟酌使用。

 附上此DBHelper类(精简版):

OLE DBHelper
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using System.Data.OleDb;

namespace DBPar.Models
{
    public class OleParModel
    {
        public static OleDbConnection oleDbConnection;

        public static OleDbTransaction oletransaction;

        public static OleDbCommand oleDbCommand;

        public static OleDbDataReader oleDbDataReader;


        /// <summary>
        /// DB连接
        /// </summary>
        public static void PreProcess()
        {
            if (string.IsNullOrEmpty(DBConfig.OLE_DBConnectionString))
            {
                DBConfig.Init();
            }

            if (oleDbConnection == null)
            {
                try
                {
                    oleDbConnection = new OleDbConnection(DBConfig.OLE_DBConnectionString);
                    oleDbConnection.Open();
                }
                catch (InvalidOperationException)
                {

                    throw new Exception("DB连接不存在" + DBConfig.OLE_DBConnectionString);
                }
            }

            if (oletransaction == null)
            {
                if (oleDbConnection.State != System.Data.ConnectionState.Open)
                {
                    oleDbConnection.Open();
                }

                oletransaction = oleDbConnection.BeginTransaction();
            }
        }

        public static void EndProcess()
        {
            if (oleDbDataReader != null)
            {
                if (!oleDbDataReader.IsClosed)
                {
                    oleDbDataReader.Close();
                }
                oleDbDataReader = null;
            }
            if (oleDbCommand != null)
            {
                oleDbCommand.Dispose();
                oleDbCommand = null;
            }

            if (oletransaction != null)
            {
                oletransaction.Commit();
                oletransaction = null;
            }
        }

        public static void PrepareDbSql(string sql)
        {
            if (oleDbCommand != null)
            {
                oleDbCommand.Dispose();
            }
            oleDbCommand = new OleDbCommand(sql, oleDbConnection,oletransaction);
        }

        /// <summary>
        ///参数追加
        /// </summary>
        /// <param name="valName"> 参数名(实际不起作用)</param>
        /// <param name="var">参数値</param>
        /// <param name="valType">参数类型</param>
        public static void AddDbParameter(string valName, object var, OleDbType valType)
        {
            OleDbParameter p = new OleDbParameter();
            p.ParameterName = valName;
            p.Direction = ParameterDirection.Input;
            p.OleDbType = valType;
            p.IsNullable = true;
            p.Value = var;
            oleDbCommand.Parameters.Add(p);

            oleDbCommand.CommandType = CommandType.StoredProcedure;
        }

        public static DataSet GetDataSet(string tablename)
        {
            DataSet ds = new DataSet();
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            adapter.SelectCommand = oleDbCommand;
            adapter.Fill(ds, tablename);

            return ds;
        }

        public static int ExecuteDbUpdate()
        {
            return oleDbCommand.ExecuteNonQuery();
        }
    }
}

 下一篇:MSDAORA Sql的参数传递方法

posted on 2013-03-05 12:26  走遍江湖  阅读(1744)  评论(0编辑  收藏  举报