DbHelper basic usage

对于使用微软的DataAccess Application Block的朋友,我这里有另一个选择,DbHelper。这是一个我做的Helper,用来满足自己的需求。这里介绍一下以便大家参考。

微软的DataAccess Application Block与DbHelper目的基本相同,它们没有谁好谁坏,只有适合与不适合,它们的区别在于:

  1. DbHelper的使用方式更简单。主要是因为把参数的部分简化了许多,现在根本不用生成参数了,但是对传入的参数对象也予以支持。
  2. DbHelper支持基本上所有的.NET下的Data Provider,而不只是SQL Server, Oracle与DB2,对其他非自带的Data Provider只需要实现一下获取其识别参数的方式就可以对其提供支持了,具体请见示例。
  3. 因为我不用存储过程,所以目前版本的DbHelper不支持存储过程。不过如果很多人需要的话我可以考虑添加这个功能。

以下为各种使用示例:

Executes a SQL command

None.gif using  Cavingdeep.Util.DataAccess;
None.gif
None.gif
//  创建一个SqlHelper的实例。
None.gif
IDbHelper dbHelper  =   new  SqlHelper(connection);
None.gif
None.gif
string  insertCommandText  =   " INSERT INTO test VALUES (@text, @record_date) " ;
None.gif
None.gif
//  执行SQL命令。
None.gif
dbHelper.ExecuteCommand(insertCommandText,  " Text1 " , DateTime.Now);
None.gif

就是这样简单,不用声明SQL参数,直接将参数值传入便可以了。不过当你需要明确指定参数类型等信息时也可以生成参数对象后传入,像以下示例。以下示例是一个混合模式的参数传入:

None.gif string  insertCommandText  =   " INSERT INTO test VLAUES (@text, @record_date) " ;
None.gif
None.gifSqlParameter parameter 
=   new  SqlParameter();
None.gifparameter.ParameterName 
=   " @record_date " ;
None.gifparameter.Value 
=  DateTime.Now;
None.gifparameter.DbType 
=  DbType.DateTime;
None.gif
None.gifdbHelper.ExecuteCommand(insertCommandText, 
" Text1 " , parameter);

ExecuteReader

None.gif string  selectCommandText  =   " SELECT text, record_date FROM test WHERE text = @text " ;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
using  (IDataReader reader  =  dbHelper.ExecuteReader(selectCommandText,  " Text1 " ))  dot.gif {
InBlock.gif   reader.Read();
InBlock.gif
InBlock.gif   
this.textBox1.SelectedText = (string) reader["text"+ Environment.NewLine;
InBlock.gif   
this.textBox1.SelectedText = reader["record_date"].ToString();
ExpandedBlockEnd.gif}

Execute DataSet

None.gif string  selectCommandText  =   " SELECT text, record_date FROM test WHERE text = @text " ;
None.gif
None.gifDataSet ds 
=  dbHelper.ExecuteDataSet( " Test " , selectCommandText,  " Text1 " );

Transaction overloaded methods

None.gif string  insertCommandText  =   " INSERT INTO test VALUES (@text, @record_date) " ;
None.gif
None.gifconnection.Open();
None.gifSqlTransaction transaction 
=  connection.BeginTransaction();
ExpandedBlockStart.gifContractedBlock.gif
try   dot.gif {
InBlock.gif   dbHelper.ExecuteCommand(transaction, insertCommandText, 
"Text1", DateTime.Now);
InBlock.gif   transaction.Commit();
ExpandedBlockStart.gifContractedBlock.gif}
  catch   dot.gif {
InBlock.gif   transaction.Rollback();
ExpandedBlockStart.gifContractedBlock.gif}
  finally   dot.gif {
InBlock.gif   connection.Close();
ExpandedBlockEnd.gif}

Extending support for other data providers

假设我们要对OLEDB进行支持,一般来说第一个步骤就是要实现IDbHelper接口,但是我们大可不必如此费事,DbHelper自带了一个默认支持多Data Provider的IDbHelper实现,这个实现就叫做"DbHelper",所以我们只要继承"DbHelper"就可以了,如下:

None.gif using  System.Data.OleDb;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   class  OleDbHelper : DbHelper  dot.gif {
InBlock.gif   
public OleDbHelper(OleDbConnection connection) :
InBlock.gif      
base(connection, typeof(OleDbConnection), typeof(OleDbCommand),
InBlock.gif            
typeof(OleDbParameter), typeof(OleDbDataAdapter),
ExpandedSubBlockStart.gifContractedSubBlock.gif            
new OleDbParameterRecognizer()) dot.gif{}
ExpandedBlockEnd.gif}

将DbHelper需要的第三方data provider的各种类型传入DbHelper的构造方法中就可以了。不过值得注意的是还需要传入一个IParameterRecognizer,这个就是唯一需要我们自行实现的部分。IParameterRecognizer的作用是识别第三方data provider所支持的SQL参数的写法,比如SQL Server中是"@parameterName",OLEDB中要用"?"等等。这里我提供一个OleDb的IParameterRecognizer实现以供参考:

ExpandedBlockStart.gif ContractedBlock.gif internal   class  OleDbParameterRecognizer : IParameterRecognizer  dot.gif {
InBlock.gif   
private readonly Regex paramsRegex = new Regex(@"\?", RegexOptions.Compiled);
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public string[] GetSqlParametersName(string commandText) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif      
if (commandText == null || commandText.Length == 0dot.gif{
InBlock.gif         
throw new ArgumentNullException("commandText");
ExpandedSubBlockEnd.gif      }

InBlock.gif
InBlock.gif      MatchCollection paramsNameMatches 
= this.paramsRegex.Matches(commandText);
InBlock.gif
InBlock.gif      ArrayList parameterNames 
= new ArrayList();
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
for (int i = 0; i < paramsNameMatches.Count; i++dot.gif{
InBlock.gif         parameterNames.Add(
null);
ExpandedSubBlockEnd.gif      }

InBlock.gif
InBlock.gif      
return (string[]) parameterNames.ToArray(typeof(string));
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

基本上就是用正则表达式去找出符合规则的SQL参数,然后将参数名字添加到集合中,最后返回一个参数名的数组。注意OLEDB中是没有参数名的,所以每找到一个参数我就向集合中添加一个null值。

好了,一切都写好了后就可以完美的支持第三方data provider了。^_^

转载于:https://www.cnblogs.com/cavingdeep/archive/2005/10/13/253789.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值