惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
G
Google Developers Blog
B
Blog
Engineering at Meta
Engineering at Meta
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
The Cloudflare Blog
The Hacker News
The Hacker News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
雷峰网
雷峰网
F
Fortinet All Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
量子位
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
H
Help Net Security
Help Net Security
Help Net Security
P
Palo Alto Networks Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
W
WeLiveSecurity
V
Vulnerabilities – Threatpost
T
The Exploit Database - CXSecurity.com
Know Your Adversary
Know Your Adversary
Apple Machine Learning Research
Apple Machine Learning Research
Scott Helme
Scott Helme
N
News | PayPal Newsroom
AWS News Blog
AWS News Blog
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
腾讯CDC
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
TaoSecurity Blog
TaoSecurity Blog
GbyAI
GbyAI
Y
Y Combinator Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
D
Docker

博客园 - Cavingdeep

用metaclass实现AOP风格的Profiler Singleton implementation using metaclass 初试IronPython与.NET的集成 Refactoring as a way to improve the existing design 用metaclass来实现AOP 不该用Generics实现Abstract Factory的理由 新兴XML处理方法VTD-XML介绍 Performance Tips I DCG 2.0.72 (Beta1) 发布了 NUnit发布2.2.3兼容.NET 2.0 RTM 如果你想拥有一个可嵌入式模板引擎…… 改进ASP语法打造更高效的模板语言II 改进ASP语法打造更高效的模板语言 XML的特征以及一些用途 Release of DbHelper 1.2.1 深入XML系列技术 DbHelper at Tigris SQLite系列 集合的初始容量与性能
DbHelper basic usage
Cavingdeep · 2005-10-13 · via 博客园 - Cavingdeep

对于使用微软的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

using Cavingdeep.Util.DataAccess;

// 创建一个SqlHelper的实例。
IDbHelper dbHelper = new SqlHelper(connection);

string insertCommandText = "INSERT INTO test VALUES (@text, @record_date)";

// 执行SQL命令。
dbHelper.ExecuteCommand(insertCommandText, "Text1", DateTime.Now);

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

string insertCommandText = "INSERT INTO test VLAUES (@text, @record_date)";

SqlParameter parameter 
= new SqlParameter();
parameter.ParameterName 
= "@record_date";
parameter.Value 
= DateTime.Now;
parameter.DbType 
= DbType.DateTime;

dbHelper.ExecuteCommand(insertCommandText, 
"Text1", parameter);

ExecuteReader

string selectCommandText = "SELECT text, record_date FROM test WHERE text = @text";

using (IDataReader reader = dbHelper.ExecuteReader(selectCommandText, "Text1")) {
   reader.Read();

   
this.textBox1.SelectedText = (string) reader["text"+ Environment.NewLine;
   
this.textBox1.SelectedText = reader["record_date"].ToString();
}

Execute DataSet

string selectCommandText = "SELECT text, record_date FROM test WHERE text = @text";

DataSet ds 
= dbHelper.ExecuteDataSet("Test", selectCommandText, "Text1");

Transaction overloaded methods

string insertCommandText = "INSERT INTO test VALUES (@text, @record_date)";

connection.Open();
SqlTransaction transaction 
= connection.BeginTransaction();
try {
   dbHelper.ExecuteCommand(transaction, insertCommandText, 
"Text1", DateTime.Now);
   transaction.Commit();
}
 catch {
   transaction.Rollback();
}
 finally {
   connection.Close();
}

Extending support for other data providers

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

using System.Data.OleDb;

public class OleDbHelper : DbHelper {
   
public OleDbHelper(OleDbConnection connection) :
      
base(connection, typeof(OleDbConnection), typeof(OleDbCommand),
            
typeof(OleDbParameter), typeof(OleDbDataAdapter),
            
new OleDbParameterRecognizer()) {}
}

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

internal class OleDbParameterRecognizer : IParameterRecognizer {
   
private readonly Regex paramsRegex = new Regex(@"\?", RegexOptions.Compiled);

   
public string[] GetSqlParametersName(string commandText) {
      
if (commandText == null || commandText.Length == 0{
         
throw new ArgumentNullException("commandText");
      }


      MatchCollection paramsNameMatches 
= this.paramsRegex.Matches(commandText);

      ArrayList parameterNames 
= new ArrayList();

      
for (int i = 0; i < paramsNameMatches.Count; i++{
         parameterNames.Add(
null);
      }


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

}

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

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