简单的数据访问类

一弗楚 2010-04-18 05:25:30
一个简单的数据访问类,没有使用接口,使用的是DbProviderFactory

请各位指点一下有些什么问题


/// <summary>
/// 数据访问类(ADO.NET)
/// </summary>
public class DbProvider
{
//数据提供程序
public static readonly string SqlProvider = "System.Data.SqlClient";
public static readonly string OracleProvider = "System.Data.OracleClient";
public static readonly string OdbcProvider = "System.Data.Odbc";
public static readonly string OleDbProvider = "System.Data.OleDb";

//数据库默认连接字符串
public string ConnString = ConfigurationManager.AppSettings["ConnString"];

/// <summary>
/// 数据工厂
/// </summary>
private DbProviderFactory factory;

//数据库连接对象
private DbConnection conn;

//数据库命令对象
private DbCommand cmd;

//事务对象
private DbTransaction trans;

/// <summary>
/// 是否保持数据库连接打开状态
/// </summary>
public bool isKeepOpen = false;

/// <summary>
/// 构造函数,创建一个数据库连接实例
/// </summary>
public DbProvider()
{
if (!string.IsNullOrEmpty(ConnString))
{
factory = DbProviderFactories.GetFactory(SqlProvider);
conn = factory.CreateConnection();
conn.ConnectionString = ConnString;
}
}

/// <summary>
/// 构造函数,创建一个数据库连接实例
/// <param name="provider">数据库提供程序</param>
/// </summary>
public DbProvider(string provider)
{
if (!string.IsNullOrEmpty(ConnString) && !string.IsNullOrEmpty(provider))
{
factory = DbProviderFactories.GetFactory(provider);
conn = factory.CreateConnection();
conn.ConnectionString = ConnString;
}
}

/// <summary>
/// 构造函数,创建一个数据库连接实例
/// <param name="provider">数据库提供程序</param>
/// <param name="connName">数据库连接在Connfig中的配置节点</param>
/// </summary>
public DbProvider(string provider, string connName)
{
if (string.IsNullOrEmpty(provider))
provider = SqlProvider;
ConnString = ConfigurationManager.AppSettings[connName];
factory = DbProviderFactories.GetFactory(provider);
conn = factory.CreateConnection();
conn.ConnectionString = ConnString;
}

/// <summary>
/// 打开数据库连接
/// </summary>
private void Open()
{
if (conn != null && conn.State != ConnectionState.Open)
conn.Open();
}

/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
if (conn != null && conn.State != ConnectionState.Closed && !isKeepOpen)
conn.Close();
}

/// <summary>
/// 启动事务
/// </summary>
public void BeginTrans()
{
if (conn != null)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd = conn.CreateCommand();
trans = conn.BeginTransaction();
cmd.Transaction = trans;

//事务中保持数据库连接打开状态
isKeepOpen = true;
}
}

/// <summary>
/// 提交事务
/// </summary>
public void CommitTrans()
{
try
{
trans.Commit();
}
catch
{ throw new Exception("事务提交失败"); }
finally
{
//取消数据库打开状态
isKeepOpen = false;
this.Close();
}
}

/// <summary>
/// 回滚事务
/// </summary>
public void RollbackTrans()
{
try
{
trans.Rollback();
}
catch
{ throw new Exception("事务回滚失败"); }
finally
{
//取消数据库打开状态
isKeepOpen = false;
this.Close();
}
}

/// <summary>
/// 得到数据流对象,结束后需关闭数据库连接,建议使用using
/// </summary>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
/// <returns></returns>
public IDataReader GetDataReader(CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
PrepareCommand(cmdType, cmdText, cmdParms);
return this.cmd.ExecuteReader();
}

/// <summary>
/// 执行命令对象,得到受影响的行数
/// </summary>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
/// <returns>受影响的行数或存储过程的返回值</returns>
public int ExecuteNonQuery(CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
try
{
PrepareCommand(cmdType, cmdText, cmdParms);
return this.cmd.ExecuteNonQuery();
}
catch
{
//取消数据库打开状态
isKeepOpen = false; throw new Exception("数据库操作错误");
}
finally { this.Close(); }
}

/// <summary>
/// 得到运行结果集中首行首列的值
/// </summary>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
/// <returns>首行首列的值</returns>
public object GetScalar(CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
try
{
PrepareCommand(cmdType, cmdText, cmdParms);
return this.cmd.ExecuteScalar();
}
catch
{
//取消数据库打开状态
isKeepOpen = false; throw new Exception("数据库操作错误");
}
finally { this.Close(); }
}

/// <summary>
/// 查询得到数据集的方法
/// </summary>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
/// <param name="mTableName">数据集中的表名</param>
/// <returns>对应的DataSet</returns>
public DataSet GetDataSet(CommandType cmdType, string cmdText, DbParameter[] cmdParms, string mTableName)
{
DataSet ds = new DataSet();
this.Fill(ds, cmdType, cmdText, cmdParms);
return ds;
}

/// <summary>
/// 查询得到数据集的方法
/// </summary>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
/// <returns>对应的DataSet</returns>
public DataSet GetDataSet(CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
return this.GetDataSet(cmdType, cmdText, cmdParms, null);
}

/// <summary>
/// 查询得到数据表的方法
/// </summary>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
/// <param name="mTableName">表名</param>
/// <returns>对应的DataTable</returns>
public DataTable GetDataTable(CommandType cmdType, string cmdText, DbParameter[] cmdParms, string mTableName)
{
DataSet ds = this.GetDataSet(cmdType, cmdText, cmdParms, mTableName);
if (ds.Tables.Count > 0)
return ds.Tables[0];
else
return null;
}

...全文
243 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoheng90 2010-04-19
  • 打赏
  • 举报
回复
petshop我还得好好看看源代码
一弗楚 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lester19872007 的回复:]

据说SqlHelper 好像在处理并发事务的时候有一些未知的错误,不知道是不是真的,楼主写的也不错了,能够满足自己的试用要求就行了,将来你可以对你自己的代码进行重构。使他更据可读性和易用性。。
[/Quote]

自己的东西就算有问题也比较好解决,主要还是想自己动手,一步步来吧,不能总是COPY别人的
一弗楚 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 starfd 的回复:]

动手写才是进步的关键~~~~

你再怎么看,东西还是那些东西,你永远都在走别人已经走过的路

你看完后加入自己的想法写,你是在别人走过的路上以自己的方式再寻找新的路径,虽然不一定是有效甚至是歪路,但这会给你更多的体会与经验
[/Quote]

是这个想法,一直在用别人的东西,就像吃菜一样,虽然不想知道菜是怎么种出来的,可是还是想知道是如何做的,那样才能做出自己的味,呵呵
lester19872007 2010-04-18
  • 打赏
  • 举报
回复
据说SqlHelper 好像在处理并发事务的时候有一些未知的错误,不知道是不是真的,楼主写的也不错了,能够满足自己的试用要求就行了,将来你可以对你自己的代码进行重构。使他更据可读性和易用性。。
  • 打赏
  • 举报
回复
动手写才是进步的关键~~~~

你再怎么看,东西还是那些东西,你永远都在走别人已经走过的路

你看完后加入自己的想法写,你是在别人走过的路上以自己的方式再寻找新的路径,虽然不一定是有效甚至是歪路,但这会给你更多的体会与经验
chen_ya_ping 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ahywg 的回复:]
引用 3 楼 caozhy 的回复:

初学者根本用不着一次又一次重复造微软已经搞好的东西。

微软提供了dbhelper.cs类,已经实现了。


刚刚看了PetShop里的SqlHelper.cs,感觉封装的不是很够
以前用的都是别人的库,感觉还是自己写一个用用好些,能够了解一下基本的东西,功能简单些不要紧主要是满足自己的开发需要就行.
[/Quote]
支持楼主,但是,不要重复的制造轮子。
bluedoctor 2010-04-18
  • 打赏
  • 举报
回复
赞赏搂主的精神。不过自己写的话要考虑很多细节问题,比如事务,线程安全。
楼主可以下载一个类似的框架看看:
http://www.pwmis.com/sqlmap/
wuyq11 2010-04-18
  • 打赏
  • 举报
回复
多看看ORM
继承接口实现多种数据库操作
xingshungames 2010-04-18
  • 打赏
  • 举报
回复
进来学习一下
一弗楚 2010-04-18
  • 打赏
  • 举报
回复
我会去了解一下Entity,谢谢
threenewbee 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ahywg 的回复:]
引用 8 楼 caozhy 的回复:

引用 7 楼 ahywg 的回复:
引用 5 楼 cpp2017 的回复:

SqlHelper应该是够了,当然你如果觉得用着不习惯自己写也是好的,毕竟这花不了多少时间.


主要还是想通过写访问类再了解一下ado.net,学了这么久还有很多基本的东西都不清楚,真去写才觉得有很多不明白的,特别是OO的应用

OO应用,去用 Entity ……
[/Quote]
新一代的菜鸟可以用Entity了。
一弗楚 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 caozhy 的回复:]

引用 7 楼 ahywg 的回复:
引用 5 楼 cpp2017 的回复:

SqlHelper应该是够了,当然你如果觉得用着不习惯自己写也是好的,毕竟这花不了多少时间.


主要还是想通过写访问类再了解一下ado.net,学了这么久还有很多基本的东西都不清楚,真去写才觉得有很多不明白的,特别是OO的应用

OO应用,去用 Entity Framework 吧。完全傻瓜化的数据访……
[/Quote]

如果不重复那不一直是菜鸟了,有些东西总要去尝试的,否则恐怕连别人的东西都看不懂了,呵呵
threenewbee 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ahywg 的回复:]
引用 5 楼 cpp2017 的回复:

SqlHelper应该是够了,当然你如果觉得用着不习惯自己写也是好的,毕竟这花不了多少时间.


主要还是想通过写访问类再了解一下ado.net,学了这么久还有很多基本的东西都不清楚,真去写才觉得有很多不明白的,特别是OO的应用
[/Quote]
OO应用,去用 Entity Framework 吧。完全傻瓜化的数据访问。

为什么2010年还看到大量的菜鸟去重复实践10年前的菜鸟所做的事情呢。
一弗楚 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cpp2017 的回复:]

SqlHelper应该是够了,当然你如果觉得用着不习惯自己写也是好的,毕竟这花不了多少时间.
[/Quote]

主要还是想通过写访问类再了解一下ado.net,学了这么久还有很多基本的东西都不清楚,真去写才觉得有很多不明白的,特别是OO的应用
一弗楚 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cpp2017 的回复:]

没看出什么问题
.
[/Quote]

可能是功能比较简单,呵呵,主要是担心数据库连接的关闭和扩展是否方便(用的都是DbConnection这样的抽象类而不是SqlConnection)
cpp2017 2010-04-18
  • 打赏
  • 举报
回复
SqlHelper应该是够了,当然你如果觉得用着不习惯自己写也是好的,毕竟这花不了多少时间.
一弗楚 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 caozhy 的回复:]

初学者根本用不着一次又一次重复造微软已经搞好的东西。

微软提供了dbhelper.cs类,已经实现了。
[/Quote]

刚刚看了PetShop里的SqlHelper.cs,感觉封装的不是很够
以前用的都是别人的库,感觉还是自己写一个用用好些,能够了解一下基本的东西,功能简单些不要紧主要是满足自己的开发需要就行.
threenewbee 2010-04-18
  • 打赏
  • 举报
回复
初学者根本用不着一次又一次重复造微软已经搞好的东西。

微软提供了dbhelper.cs类,已经实现了。
cpp2017 2010-04-18
  • 打赏
  • 举报
回复
没看出什么问题
.
一弗楚 2010-04-18
  • 打赏
  • 举报
回复

/// <summary>
/// 查询得到数据表的方法
/// </summary>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
/// <returns>对应的DataTable</returns>
public DataTable GetDataTable(CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
return this.GetDataTable(cmdType, cmdText, cmdParms, null);
}

/// <summary>
/// 填充数据集的方法
/// </summary>
/// <param name="mDataSet">数据集对象</param>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
public void Fill(DataSet mDataSet, CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
DbDataAdapter da = this.factory.CreateDataAdapter();
try
{
PrepareCommand(cmdType, cmdText, cmdParms);
da.SelectCommand = this.cmd;
da.Fill(mDataSet);
}
catch
{
//取消数据库打开状态
isKeepOpen = false;
throw new Exception("数据库操作错误");
}
finally { da.Dispose(); this.Close(); }
}

/// <summary>
/// 初始化命令对象
/// </summary>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdText">命令字符串</param>
/// <param name="cmdParms">参数</param>
private void PrepareCommand(CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
if (conn != null)
{
if (conn.State != ConnectionState.Open)
conn.Open();
if (cmd == null)
this.cmd = conn.CreateCommand();
}
if (trans != null)
cmd.Transaction = trans;

cmd.CommandType = cmdType;
cmd.CommandText = cmdText;

if (cmdParms != null)
{
for (int i = 0; i < cmdParms.Length; i++)
cmd.Parameters.Add(cmdParms[i]);
}
}
}

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧