1、IAdoNetBuilder.cs
-------------------------
using System;
namespace GeneralForums.Web
{
///
/// 帮助建立各种 ADO.NET 对象的处理器。
///
public interface IAdoNetBuilder
{
///
/// 建立到数据存储的连接。
///
/// 返回已经创建的 System.Data.IDbConnection 对象引用。
System.Data.IDbConnection CreateConnection();
///
/// 创建一个 System.Data.IDbDataAdapter。
///
/// 返回已经创建的 System.Data.IDbDataAdapter 对象引用。
System.Data.IDbDataAdapter CreateDataAdapter();
}
}
2、SqlBuilder.cs
-------------------------
using System;
namespace GeneralForums.Web
{
///
/// 定义基于 MS SQL Server 的 IAdoNetBuilder 的一个实现。
///
public class SqlBuilder : IAdoNetBuilder
{
///
/// 配置文件中用于对连接字符串进行索引的键值。
///
public static string ConnectionStringKey = "__SqlBuilder_ConnectionString";
///
/// 初始化 SqlBuilder 类的新实例。
///
public SqlBuilder()
{
}
///
/// 返回数据库连接串。
///
///
public static string ConnectionString()
{
return System.Configuration.ConfigurationSettings.AppSettings[ConnectionStringKey];
}
#region IAdoNetBuilder 成员
///
/// 建立到MS SQL Server 数据库的连接。
///
/// 返回已经创建的 System.Data.IDbConnection 对象引用。
/// 从当前配置文件(.config)中获取连接信息(索引键值为“__SqlBuilder_ConnectionString”),
并建立相应的连接。配置文件中的连接信息是明文的,没有经过任何加密,为了保证数据库的安全,
应该考虑对 SqlCreator 提供集成的数据库验证。
public System.Data.IDbConnection CreateConnection()
{
return new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ConnectionStringKey]);
}
///
/// 创建一个 System.Data.IDbDataAdapter。
///
/// 返回已经创建的 System.Data.IDbDataAdapter 对象引用。
public System.Data.IDbDataAdapter CreateDataAdapter()
{
return new System.Data.SqlClient.SqlDataAdapter();
}
#endregion
}
}
3、AdoNetHelper.cs
-------------------------
using System;
namespace GeneralForums.Web
{
///
/// 为加载当前的 IAdoNetBuilder 提供方法。不能继承该类。
///
public sealed class AdoNetHelper
{
private AdoNetHelper()
{
}
private static IAdoNetBuilder _builder = null;
///
/// 配置文件中表示当前正在使用的 IAdoNetBuilder 的配置键值。
///
public static string AdoNetBuilderKey = "__AdoNetBuilder__";
///
/// 获取由当前配置确定的 IAdoNetBuilder 对象引用。
///
public static IAdoNetBuilder AdoNetBuilder
{
get
{
if(_builder == null)
{
string v = System.Configuration.ConfigurationSettings.AppSettings[AdoNetBuilderKey];
if(v == null || v.Trim() == "")
{
_builder = new SqlBuilder();
}
else
{
string [] vv = v.Split(’,’);
if(vv.Length < 2)
throw new ArgumentException("提供的数据操作配置项目的信息不够完整。");
string aname = vv[0].ToLower().Trim();
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
if(aname != System.IO.Path.GetFileName(assembly.Location).ToLower())
{
assembly = System.Reflection.Assembly.LoadFrom(vv[0]);
}
_builder = (IAdoNetBuilder)assembly.CreateInstance(vv[1]);
}
}
return _builder;
}
}
///
/// 执行指定的数据操作。
///
/// 进行数据库操作的 SQL 语句。
/// 返回操作影响的数据库的行数。
public static int Execute(string sql)
{
if(sql == null || sql.Trim() == "")
throw new ArgumentNullException("sql", "无效的数据操作语句。");
System.Data.IDbConnection conn = AdoNetBuilder.CreateConnection();
conn.Open();
try
{
System.Data.IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
return cmd.ExecuteNonQuery();
}
finally
{
conn.Close();
}
}
///
/// 从当前数据源中获取一个单一的值。
///
/// 进行数据操作使用的 SQL 语句。
/// 返回已经获取的值,如果没有相应的值,则可能返回空引用。
public static object QueryScalar(string sql)
{
if(sql == null || sql.Trim() == "")
throw new ArgumentNullException("sql", "无效的数据操作语句。");
System.Data.IDbConnection conn = AdoNetBuilder.CreateConnection();
conn.Open();
try
{
System.Data.IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
return cmd.ExecuteScalar();
}
finally
{
conn.Close();
}
}
///
/// 从当前数据源中获取一个记录行。
///
/// 进行数据库操作使用的 SQL 语句,如果语句包含一个记录集,则只返回记录集中的第一个记录行。
/// 返回已经获取的行的值,该行中的所有的值以字典的形式保存。如果没有相应的行,则返回的字典的长度为 0。
/// 如果数据库中的值为空值,则返回的字典中的相应值为空引用。
public static System.Collections.IDictionary QueryRow(string sql)
{
if(sql == null || sql.Trim() == "")
throw new ArgumentNullException("sql", "无效的数据操作语句。");
System.Data.IDbConnection conn = AdoNetBuilder.CreateConnection();
conn.Open();
try
{
System.Data.IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
System.Data.IDataReader reader = null;
try
{
reader = cmd.ExecuteReader();
if(reader.Read())
{
int count = reader.FieldCount;
System.Collections.Specialized.HybridDictionary d = new System.Collections.Specialized.HybridDictionary(count);
for(int i = 0; i < count; i ++)
{
d.Add(reader.GetName(i), reader.IsDBNull(i) ? null : reader.GetValue(i));
}
return d;
}
else
{
return new System.Collections.Specialized.HybridDictionary(1);
}
}
finally
{
if(reader != null && !reader.IsClosed)
reader.Close();
}
}
finally
{
conn.Close();
}
}
///
/// 从当前的数据源中加载一个行集。
///
/// 进行数据库操作使用的 SQL 语句。
/// 返回 System.Data.DataSet ,该集合中包含了所有的符合条件的行集。
public static System.Data.DataSet QueryRows(string sql)
{
if(sql == null || sql.Trim() == "")
throw new ArgumentNullException("sql", "无效的数据操作语句。");
System.Data.IDbConnection conn = AdoNetBuilder.CreateConnection();
conn.Open();
try
{
System.Data.IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
System.Data.IDbDataAdapter adapter = AdoNetBuilder.CreateDataAdapter();
System.Data.DataSet dataset = new System.Data.DataSet();
adapter.SelectCommand = cmd;
adapter.Fill(dataset);
return dataset;
}
finally
{
conn.Close();
}
}
}
}
=========
