我们都知道,只要涉及到数据库的程序。避免不了与数据库交互,执行带参数的存储过程和Sql等。
自然而然我们就会想“用ODP,OLE DB等这些数据提供程序要怎么写才能与数据库友好交互呢?”。以
下我就针对不同的参数传递方法做了一定的总结,有问题的地方希望大家指正。
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类(精简版):
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(); } } }