序言
数据库是我们常用的存储数据的容器,网上有很多关于SqlHelper 类库,里面有的写的很复杂很详细(有点冗余),有很多方法基本上用不到,所以自己根据很多的项目实践总结了一套适合自己的SqlHelper 类 包括 数据库的增、删、改、查、存储过程、事务等,以便后续使用,希望能给诸君有些帮助,如有错误麻烦请指出并纠正。
数据库的创建
- 创建一个银行信息数据
use master
--- 判断 系统是否有数据库
if exists(select * from sys.databases where name = 'DBBank')
drop database DBBank
--- 创建数据库
create database DBBank
on ---数据文本
(
name = 'DBBank', --逻辑名称
filename = 'D:\C#\CommonLib\SQL\Data\DBBank.mdf', --物理路径和名称
size = 5MB, -- 文件的初始大小
filegrowth = 2MB --文件的增长方式可以写大小,也可以写百分比
)
log on
(
name = 'DBBank_log',
filename = 'D:\C#\CommonLib\SQL\Data\DBBank_log.ldf', --日志后缀 .ldf
size = 5MB,
filegrowth = 2MB
)
go
- 创建 三个表 AccountInfo 账户信息表 BankCard 银行卡表 BankCard 转账信息表
use DBBank
-- 判断 表 AccountInfo 是否存在
if exists(select * from sys.objects where name = 'AccountInfo' and type = 'U')
drop table AccountInfo
go
Create table AccountInfo --建表 账户信息表
(
AccountId int primary key, --账户Id 主键
AccountCode varchar(20) check(len(AccountCode) = 18) unique, -- 身份证号码 检查长度并且唯一
AccountPhone varchar(11) check(len(AccountPhone) = 11), --电话号码
RealName nvarchar(10) not null, --姓名
OpenTime smalldatetime default(getdate()) --开户时间
)
if exists(select * from sys.objects where name = 'BankCard' and type = 'U')
drop table BankCard
create table BankCard --创建 银行卡表
(
CardNo varchar(30) primary key , ---创建卡号 主键
AccountId int not null, --账户编号(与账户信息表形成外键关系)
CardPwd varchar(20) not null, --账户密码
CardMoney money check(CardMoney >= 0) NOT NULL, --余额
CardTime smalldatetime default(getdate()) --建卡时间
)
if exists(select * from sys.objects where name = 'CardExchange' and type = 'U')
drop table CardExchange
create table CardExchange --创建 转账信息表
(
ExchangeId int primary key identity(1,1), --交易自动编号
CardNo varchar(30) not null, --银行卡号
MoneyInBank money , --存钱金额
MoneyOutBank money, --取钱金额
ExchangeTime smalldatetime default(getdate()) --交易时间
)
- 表关系图
SqlHelper类库编写
- 新建一个类库 DbUtility
在类库中新建一个类 SqlHelper
二、连接字符串
/// <summary>
/// 连接字符串
/// </summary>
private static readonly string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
其中ConfigurationManager 需要添加引用
三 在SqlHelper类中编写增、删、改通用方法
3.1 在SqlHelper 类中编写增、删、改通用方法
/// <summary>
/// 通用的增删改操作(普通的格式化SQL语句、带参数SQL语句、是否是存储过程)
/// </summary>
/// <param name="sql">SQL语句/存储过程名字</param>
/// <param name="isProcedure">存储过程</param>
/// <param name="paras">参数</param>
/// <returns></returns>
public static int ExecuteNonQuery(string sql,bool isProcedure = false, params SqlParameter[] paras)
{
//select @@Identity 返回上一次插入记录时自动产生的ID
int result = 0;
SqlConnection conn = new SqlConnection(connStr); //连接字符串
try
{
if(conn == null)
throw new ArgumentNullException("连接对象不能为空!");
SqlCommand cmd = new SqlCommand(sql, conn);
if(isProcedure)
cmd.CommandType = CommandType.StoredProcedure; //SqlCommand 设置成存储过程
if (conn.State == ConnectionState.Closed)
conn.Open(); //打开数据库
if (paras != null && paras.Length > 0)
{
cmd.Parameters.Clear(); //清空上一个数据
cmd.Parameters.AddRange(paras); //添加本次数据
}
result = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
//如果有必要在这里写个记录日志
string errorMessage = "调用ExecuteNonQuery方法发生异常:"+ex.Message;
throw new Exception(errorMessage);
}
finally //不管前面异常都会执行
{
conn.Close();
}
return result;
}
- 在WindowsFrom 测试
- 在新建一个WindowsFrom 测试程序
3.2.2 将Test 程序设置成 控制台应用程序
-
-
- 在App.config 文件中添加 connectionStrings注意一定要按照截图格式写,不能有多余的空格**
-
白色圈部分 是连接数据库的 服务器名、数据库名、账户和密码。
-
-
- 添加类库引用
-
-
-
- 测试SqlHelper 类中ExecuteNonQuery 方法
- SQL语句测试 向AccountInfo 增加一个开户信息
- 测试SqlHelper 类中ExecuteNonQuery 方法
-
/// <summary>
/// SQL语句添加
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAdd_Click(object sender, EventArgs e)
{
string sql = "insert into AccountInfo(AccountId,AccountCode,AccountPhone,RealName,Opentime)values(1,'320833200010112222','12345678900','李*','2021-12-18')";
int i = SqlHelper.ExecuteNonQuery(sql, false, null);
}
数据库中的结果
-
-
-
- SQL语句+参数的方式 向CardBank增加一个银行卡信息
-
-
/// <summary>
/// SQL语句+参数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAddParas_Click(object sender, EventArgs e)
{
string sql = "insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardTime)values" +
"(@CardNo,@AccountId,@CardPwd,@CardMoney,@CardTime)";
SqlParameter[] paras = new SqlParameter[]
{
new SqlParameter("@CardNo","6225125478544111"),
new SqlParameter("@AccountId",1), //注意 值类型不能为 0 ,如果是0 则需要装箱(object)0
new SqlParameter("@CardPwd","888888"),
new SqlParameter("@CardMoney",1000),
new SqlParameter("CardTime",DateTime.Now.ToString())
};
int i = SqlHelper.ExecuteNonQuery(sql, false, paras);
}
数据库中的结果
-
-
-
- 存储过程 向AccountInfo 增加一个开户信息
-
-
在数据库中创建一个存取记录信息的存储过程
-----存储过程 也可以 proc 有参数输入无参数输出
if exists(select * from sys.objects where name = 'proc_AddCardExchange')
drop procedure proc_AddCardExchange
go
create procedure proc_AddCardExchange
--存储过程输入参数的定义
@CardNo varchar(30),
@MoneyInBank money,