zoukankan      html  css  js  c++  java
  • 程序中执行Sql的参数传递方法总结(Oracle ODP,MSDAORA,OLE DB)

         我们都知道,只要涉及到数据库的程序。避免不了与数据库交互,执行带参数的存储过程和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的参数传递方法

    每天成就一小步,积累下来就是一大步。 转发本文请注明出处,谢谢您的阅读与分享!
  • 相关阅读:
    程序返回插入数据库成功,但是数据库内却没有数据
    C++ 使用动态二维数组参数
    深入理解.Net中的内存释放,以及有关的注意事项
    用数据集时,错误:未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值
    关于堆和栈
    C#加密方法总汇
    const与readonly
    struts 将上传文件保存到数据库中
    java Annotation注解的运用
    转:获取汉字的拼音(包括一级和二级)
  • 原文地址:https://www.cnblogs.com/lixiaobin/p/DBParamers.html
Copyright © 2011-2022 走看看