一个仿PetShop的通用DBHelper类
今天参考PetShop的SqlHelper写了个更通用的DBHelper,兼容大部分DB.感觉对于小型开发来说,使用这样的通用类,更换DB会方便.奉上代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Configuration;
namespace MBDone.Core.DBUtility
{
public static class DBHelper
{
private static readonly string connStringName = ConfigurationManager.AppSettings["connStringName"].ToString();
private static readonly string connString = ConfigurationManager.ConnectionStrings[connStringName].ConnectionString;
private static readonly string providerName = ConfigurationManager.ConnectionStrings[connStringName].ProviderName;
public static DbProviderFactory provider = DbProviderFactories.GetFactory(providerName);
#region Public Mothods
public static int ExcuteNonQuery(string cmdText, params DbParameter[] cmdParms)
{
return ExcuteNonQuery(null, CommandType.Text, cmdText, cmdParms);
}
public static int ExcuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
{
return ExcuteNonQuery(null, cmdType, cmdText, cmdParms);
}
public static int ExcuteNonQuery(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
{
using (DbConnection conn = provider.CreateConnection())
{
using (DbCommand cmd = provider.CreateCommand())
{
PrepareCommand(cmd, conn, trans, cmdType, cmdText, cmdParms);
return cmd.ExecuteNonQuery();
}
}
}
public static DbDataReader ExecuteReader(string cmdText, params DbParameter[] cmdParms)
{
return ExecuteReader(null, CommandType.Text, cmdText, cmdParms);
}
public static DbDataReader ExecuteReader(CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
{
return ExecuteReader(null, cmdType, cmdText, cmdParms);
}
public static DbDataReader ExecuteReader(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
{
DbConnection conn = provider.CreateConnection();
DbCommand cmd = provider.CreateCommand();
try
{
PrepareCommand(cmd, conn, trans, cmdType, cmdText, cmdParms);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch
{
conn.Close();
cmd.Dispose();
throw;
}
}
public static object ExecuteScalar(string cmdText, params DbParameter[] cmdParms)
{
return ExecuteScalar(null, CommandType.Text, cmdText, cmdParms);
}
public static object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
{
return ExecuteScalar(null, cmdType, cmdText, cmdParms);
}
public static object ExecuteScalar(DbTransaction trans, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
{
using (DbConnection conn = provider.CreateConnection())
{
using (DbCommand cmd = provider.CreateCommand())
{
PrepareCommand(cmd, conn, trans, cmdType, cmdText, cmdParms);
return cmd.ExecuteScalar();
}
}
}
#endregion
#region Private Methods
private static void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, CommandType cmdType, string cmdText, DbParameter[] cmdParms)
{
conn.ConnectionString = connString;
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = cmdType;
if (cmdParms != null)
{
foreach (DbParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
#endregion
}
}
使用如下:

string sql1 = "Delete From [User] Where [Id]=@Id";
DbParameter param = DBHelper.provider.CreateParameter();
param.ParameterName = "@Id";
param.Value = 3;
DbParameter[] ps = { param };
int count = DBHelper.ExcuteNonQuery(sql2, ps);
string sql2 = "SELECT TOP 100 [Id],[Name] FROM [User]";
DbDataReader dr = DBHelper.ExecuteReader(sql2, null);
while (dr.Read())
{
string name = dr[1].ToString();
}
dr.Close();
Web.config配置使用哪一种DB:(由上而下分别是Access,SQL server,SQLite)

<appSettings>
<add key="connStringName" value="defaultConnectionString1"/>
</appSettings>
<connectionStrings>
<add name="defaultConnectionString1" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\UserDB.mdb;Jet OLEDB:Database Password=1234567" providerName="System.Data.OleDb"/>
<add name="defaultConnectionString2" connectionString="Data Source=10.152.86.42;Initial Catalog=UserDB;Persist Security Info=False;User ID=sa; pwd = 1234567" providerName="System.Data.SqlClient"/>
<add name="defaultConnectionString3" connectionString="Data Source=|DataDirectory|\UserDB.s3db;Version=3;BinaryGUID=False;" providerName="System.Data.SQLite"/>
</connectionStrings>
注意如果使用SQLite除了引用"System.Data.SQLite.DLL"(在 http://sourceforge.net/projects/sqlite-dotnet2 下载 ADO.NET 2.0 Provider。找到下载包中的 System.Data.SQLite.DLL 拷贝到程序 Bin 目录。)
还必须配置DB Provider:

<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/>
</DbProviderFactories>
</system.data>
否则会报错:

Unable to find the requested .Net Framework Data Provider. It may not be installed.
注:本文基于WebApp开发而讲述.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)