如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界,最快捷和最容易的就是C#.NET,准备好了,就随我加入代码的世界吧!
一、添加数据库访问帮助类:
1、添加类文件:
选中CommonLibrary类库,鼠标右键点击添加选择类进入添加新项界面:
将类名改为DBHelper,点击添加:
这时我们可以看到CommonLibrary类库中就会存在我们刚刚创建的DBHelper类了,我们需要把访问修饰符改为public,这时我们的帮助类就创建好了:
注意:访问修饰符有下面六种:
1、public
:成员可以被任何其他代码访问;
2、private
:成员只能在其定义的类内部访问;
3、protected
:成员可以被定义的类以及派生类中访问;
4、internal
:成员可以在同一个程序集的代码中访问,对其他程序集不可见;
5、protected internal
:成员可以由当前程序集或派生类中的代码访问;
6、private protected
:成员可以在其定义的类及派生类中被访问,但仅当这些派生类在同一个程序集中时;
2、添加依赖包:
当我们进行数据库访问时,需要用到数据库相对应的依赖包,以我这个举例,我使用的是SQL,所以,我引入的是微软的Microsoft.Data.SqlClient,如果是MySQL,则引入MySql.Data等等:
点击依赖项,鼠标点击右键,点击管理NuGet程序包:
这时我们会进入NuGet包管理器,我们点击浏览,然后在输入框输入sql,下面会列出所有与SQL有关的依赖包:
我们选择微软的Microsoft.Data.SqlClient,选择版本,点击安装:
稍等片刻,在输出界面会有该依赖包的下载进度,等到完成后,将会弹出接受许可证的窗口,我们点击接受就行:
这时我们可以看到该包状态为已安装:
我们也可以到已安装中查看自己已经安装的包和包对应的版本:
3、创建数据库连接字符串字段:
包添加成功后,我们进入DBHelper类,给我们的类添加注释,这样方便我们阅读代码:
注意:C#的注释有三种分别是:
1、第一种是以“//”符号开始,任何位于“//”符号后的本行文字都视为注释(场景为单行注释);
2、第二种是以“/*”开始,“*/”结束。任何介于这对符号之间的文字块都视为注释(场景为多行注释);
3、第三种是XML注释方式,即"///"开始(场景一般为类、接口、枚举、函数等),如下图:
接着我们添加一个数据库连接对象和一个数据库连接字符串在DBHelper类中,同样添加注释(记住注释写的越详细,代码可阅读性就越强大,当然我个人比较喜欢写注释,所以才建议大家多写注释,正常情况我们是会读取配置文件中的连接字符串,我这里为了方便大家理解和接受,就直接写在程序中了):
/// <summary>
/// 数据库连接对象
/// </summary>
private SqlConnection _sqlConnection;
/// <summary>
/// 数据库连接字符串
/// </summary>
private string conn = "Server=localhost;Database=StudyDB;User Id=sa;Password=sa123456.;Connect Timeout=30;Integrated Security=True;Trusted_Connection=false;";
二、初始化数据库访问连接:
在DBHelper类中,我们可以通过DBHelper类的构造函数来初始化数据库连接对象并将数据库访问对象的状态打开:
/// <summary>
/// 构造函数
/// </summary>
public DBHelper() {
//判断是否已经存在连接对象,没有则创建连接对象
if (_sqlConnection == null)
{
_sqlConnection = new SqlConnection(conn);
}
//当连接状态为关闭时
if (_sqlConnection.State == System.Data.ConnectionState.Closed)
{
//打开连接
_sqlConnection.Open();
}
//当连接状态为断开时
if (_sqlConnection.State == System.Data.ConnectionState.Broken)
{
//先关闭
_sqlConnection.Close();
//再打开
_sqlConnection.Open();
}
}
三、添加数据库查询公用方法:
在DBHelper类中我们添加数据库查询方法,最后返回SqlDataReader :
注意:
System.Data.CommandBehavior.CloseConnection
是一个枚举值,用于指定当数据被读取时,关闭与数据源的连接。这个特定的值常用于 ExecuteReader
方法,以确保在执行完数据读取操作后,数据库连接能够被正确关闭;
/// <summary>
/// 执行查询数据SQL
/// </summary>
/// <param name="sql">查询sql</param>
/// <returns>数据库查询结果</returns>
public SqlDataReader GetDataReader(string sql)
{
using (SqlCommand command = new SqlCommand(sql, _sqlConnection))
{
return command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
}
四、添加数据库添加、删除、修改公用方法:
在DBHelper类中我们添加数据库添加、修改、删除方法,最后返回受影响的行数:
注意:
ExecuteNonQuery()方法的返回值表示了SQL命令执行后所影响的行数。如果执行的是插入、更新或删除操作,并且操作成功,那么返回的值就是该命令所影响的行数。如果影响的行数为0,表示没有行被影响;如果数据操作被回滚,则返回值为-1。
/// <summary>
/// 执行数据库增删改操作
/// </summary>
/// <param name="sql">数据库增删改语句</param>
/// <returns>数据库受影响的行数</returns>
public int GetExecuteNonQuery(string sql)
{
using (SqlCommand command = new SqlCommand(sql, _sqlConnection))
{
return command.ExecuteNonQuery();
}
}
五、添加执行聚合函数的方法:
在DBHelper类中我们添加执行数据库聚合函数方法,最后返回聚合函数执行的结果对象:
注意:
ExecuteScalar()方法的作用是执行查询,并返回查询所返回的结果集中第一行的第一列。所有其他的列和行将被忽略,它的返回值是object,若是想判断某条数据在数据库里存不存在或者执行查询聚合函数的结果,便可使用该方法。
/// <summary>
/// /执行SQL聚合函数
/// </summary>
/// <param name="sql">聚合函数SQL</param>
/// <returns>聚合函数执行结果</returns>
public object GetExecuteScalar(string sql)
{
using (SqlCommand command = new SqlCommand(sql, _sqlConnection))
{
return command.ExecuteScalar();
}
}
六、添加批量插入数据方法
在DBHelper类中我们添加批量插入数据到数据库的方法,最后插入的数据条数:
注意:
DataTable的字段名需和数据表中的字段名一致,顺序也要一致,一般情况下都是通过创建虚拟表然后再把数据插入数据表中,以便于做数据的相应处理,如对已有数据进行更新等,我这里是因为基本上用不到,所以简化了;
七、添加执行存储过程的方法:
在DBHelper类中我们添加执行增删改查和聚合函数的存储过程方法:
/// <summary>
/// 执行增删改存储过程
/// </summary>
/// <param name="storedProcedureName">存储过程名称</param>
/// <param name="sqlParameters">存储过程参数</param>
/// <param name="commandType">执行SQL类型</param>
/// <returns>存储过程执行后受影响的行数</returns>
public int GetExecuteNonQuery(string storedProcedureName, SqlParameter[] sqlParameters, CommandType commandType = CommandType.StoredProcedure)
{
using (SqlCommand command = new SqlCommand(storedProcedureName, _sqlConnection))
{
command.CommandType = commandType;
command.Parameters.AddRange(sqlParameters);
_sqlConnection.Open();
return command.ExecuteNonQuery();
}
}
/// <summary>
/// 执行聚合函数存储过程
/// </summary>
/// <param name="storedProcedureName">存储过程名称</param>
/// <param name="sqlParameters">存储过程参数</param>
/// <param name="commandType">执行SQL类型</param>
/// <returns>存储过程执行后的结果</returns>
public object GetExecuteScalar(string storedProcedureName, SqlParameter[] sqlParameters, CommandType commandType = CommandType.StoredProcedure)
{
using (SqlCommand command = new SqlCommand(storedProcedureName, _sqlConnection))
{
command.CommandType = commandType;
command.Parameters.AddRange(sqlParameters);
_sqlConnection.Open();
return command.ExecuteScalar();
}
}
/// <summary>
/// 执行查询类型的存储过程
/// </summary>
/// <param name="storedProcedureName">存储过程名称</param>
/// <param name="sqlParameters">存储过程参数</param>
/// <param name="commandType">执行SQL类型</param>
/// <returns>存储过程执行结果</returns>
public SqlDataReader GetDataReader(string storedProcedureName, SqlParameter[] sqlParameters, CommandType commandType = CommandType.StoredProcedure)
{
using (SqlCommand command = new SqlCommand(storedProcedureName, _sqlConnection))
{
command.CommandType = commandType;
command.Parameters.AddRange(sqlParameters);
return command.ExecuteReader();
}
}
/// <summary>
/// 确保数据库被适当的释放
/// </summary>
public void Dispose()
{
_sqlConnection?.Dispose();
}
这样数据库操作类和操作方法我们就算完成了!