机房收费系统总结之3——SqlHelper

        刚一开始着手机房收费系统时,涉及数据库连接,每个D层类的方法都要单独访问一次数据库。正所谓无知者无谓,不厌其烦的去弄,精神可嘉。再看别人博客时,才发现还有SqlHelper这么强的“思想”。高人啊。
        SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法。SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。


        在SQLHelper中主要有四类,分别是:
        不带参数的sql增删改语句或存储过程(无返回行或值)
        带参数的sql增删改语句或存储过程(无返回行或值)
        不带参数的sql查询语句或存储过程,返回DataTable结果集(有返回行或值)
        带参数的sql查询语句或存储过程,返回DataTable结果集(有返回行或值)


1.通过配置文件获取连接字符串(步骤及优点上篇博客已介绍)

Imports System.Data.SqlClient
Imports System.Configuration        '添加对配置文件的引用
Public Class SqlHelper

    '通过配置文件获取连接字符串并赋值给所声明的变量strConnection
    Dim strConnection As String = ConfigurationManager.AppSettings("strSqlConnection")

    Dim conn As SqlConnection = New SqlConnection(strConnection)                    '设置连接 
    Dim cmd As New SqlCommand                                                       '声明SqlCommand类变量cmd

2.提取重复代码部分(每次数据库连接之后都需要关闭连接、关闭命令)

    ''' <summary>
    ''' 关闭连接
    ''' </summary>
    ''' <param name="conn">需要关闭的连接</param>
    ''' <remarks></remarks>
    Private Sub CloseConn(ByVal conn As SqlConnection)
        '如果没有关闭,则关闭连接
        If (conn.State <> ConnectionState.Closed) Then
            conn.Close()
            conn = Nothing
        End If
    End Sub

    ''' <summary>
    ''' 关闭命令
    ''' </summary>
    ''' <param name="cmd">需要关闭的命令</param>
    ''' <remarks></remarks>
    Private Sub CloseCmd(ByVal cmd As SqlCommand)
        '如果没有关闭,则关闭命令
        If Not IsNothing(cmd) Then
            cmd.Dispose()
            cmd = Nothing
        End If
    End Sub

3.具体操作。分别是有参增删改、无参增删改、有参查询、无参查询。

    ''' <summary>
    ''' 关闭命令
    ''' </summary>
    ''' <param name="cmd">需要关闭的命令</param>
    ''' <remarks></remarks>
    Private Sub CloseCmd(ByVal cmd As SqlCommand)
        '如果没有关闭,则关闭命令
        If Not IsNothing(cmd) Then
            cmd.Dispose()
            cmd = Nothing
        End If
    End Sub
    ''' <summary>  
    ''' 有参数的 增删改 操作
    ''' </summary>  
    ''' <param name="cmdText">需要执行的命令</param>  
    ''' <param name="cmdType">所执行命令的类型,一般是Sql语句,也有可能是存储过程,或表</param>  
    ''' <param name="sqlParams">参数数组</param>  
    ''' <returns>返回执行 增删改 语句受影响的行数,为Integer类型</returns>  
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As Integer

        '将传入的值,分别为cmd的属性赋值  
        cmd.Parameters.AddRange(sqlParams)      '将参数传入  
        cmd.CommandType = cmdType               '设置一个值,解释cmdText  
        cmd.Connection = conn                   '设置连接  
        cmd.CommandText = cmdText               '设置查询的语句  

        '执行操作
        Try
            conn.Open()                         '打开连接  
            Return cmd.ExecuteNonQuery()        '执行增删改操作并返回受影响的行数  
            cmd.Parameters.Clear()              '清除参数  
        Catch ex As Exception
            Return 0                            '如果出错,返回0  
        Finally
            Call CloseConn(conn)                '关闭连接
            Call CloseCmd(cmd)                  '关闭连接
        End Try

    End Function




    ''' <summary>
    ''' 无参数的 增删改 操作
    ''' </summary>
    ''' <param name="cmdText">需要执行的命令</param>
    ''' <param name="cmdType">所执行命令的类型,一般是Sql语句,也有可能是存储过程,或表</param>
    ''' <returns>返回执行 增删改 语句受影响的行数,为Integer类型</returns>
    Public Function ExecAddDelUpdate(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer

        '将传入的参数,分别为cmd的属性赋值
        cmd.CommandType = cmdType               '设置一个值,解释cmdText  
        cmd.Connection = conn                   '设置连接  
        cmd.CommandText = cmdText               '设置查询的语句  

        '执行操作
        Try
            conn.Open()                         '打开连接  
            Return cmd.ExecuteNonQuery()        '执行增删改操作并返回受影响的行数  
            cmd.Parameters.Clear()              '清除参数  
        Catch ex As Exception
            Return 0                            '如果出错,返回0  
        Finally
            Call CloseConn(conn)                '关闭连接
            Call CloseCmd(cmd)                  '关闭连接
        End Try

    End Function




    ''' <summary>
    ''' 有参数的 查询 操作
    ''' </summary>
    ''' <param name="cmdText">需要执行的命令</param>  
    ''' <param name="cmdType">所执行命令的类型,一般是Sql语句,也有可能是存储过程,或表</param>  
    ''' <param name="sqlParams">参数数组</param>  
    ''' <returns>返回执行 查询 得到的结果,为DataTable类型</returns>  
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As DataTable

        Dim sqlAdapter As SqlDataAdapter        '声明适配器
        Dim dt As New DataTable                 '声明数据表
        Dim ds As New DataSet                   '声明数据缓存

        '将传入的值,分别为cmd的属性赋值  
        cmd.Parameters.AddRange(sqlParams)      '将参数传入  
        cmd.CommandType = cmdType               '设置一个值,解释cmdText  
        cmd.Connection = conn                   '设置连接  
        cmd.CommandText = cmdText               '设置查询的语句  

        sqlAdapter = New SqlDataAdapter(cmd)    '实例化适配器

        '执行操作
        Try
            sqlAdapter.Fill(ds)                 '用适配器对ds进行填充
            dt = ds.Tables(0)                   '返回数据集的第一个表
            cmd.Parameters.Clear()              '清除参数
        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn(conn)                '关闭连接
            Call CloseCmd(cmd)                  '关闭连接
        End Try
        Return dt

    End Function




    ''' <summary>
    ''' 无参数的 查询 操作,返回值为DataTable类型
    ''' </summary>
    ''' <param name="cmdText">需要执行的命令</param>  
    ''' <param name="cmdType">所执行命令的类型,一般是Sql语句,也有可能是存储过程,或表</param>  
    ''' <returns>返回执行 查询 得到的结果,为DataTable类型</returns>  
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable

        Dim sqlAdapter As SqlDataAdapter        '声明适配器
        Dim dt As New DataTable                 '声明数据表
        Dim ds As New DataSet                   '声明数据缓存

        '将传入的值,分别为cmd的属性赋值  
        cmd.CommandType = cmdType               '设置一个值,解释cmdText  
        cmd.Connection = conn                   '设置连接  
        cmd.CommandText = cmdText               '设置查询的语句  

        sqlAdapter = New SqlDataAdapter(cmd)    '实例化适配器

        '执行操作
        Try
            sqlAdapter.Fill(ds)                 '用适配器对ds进行填充
            dt = ds.Tables(0)                   '返回数据集的第一个表
        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn(conn)                '关闭连接
            Call CloseCmd(cmd)                  '关闭连接
        End Try
        Return dt

    End Function

End Class

         
可见SqlHelper是对数据库访问的一次抽象、一次打包,更是一次思想的升华。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 37
    评论
学生信息管理系统是一个常见的应用系统,使用C#语言采用三层架构进行开发,可以提高系统的可维护性、可扩展性、可重用性和可测试性等方面的优势。 三层架构是一个比较经典的软件架构,它将应用程序划分为三个主要的部分:表示层、业务逻辑层和数据访问层。每一层都有不同的职责,但它们又协同工作,为应用程序提供了良好的结构和可维护性。 下面我来介绍一下如何使用C#语言来开发一个学生信息管理系统。 一、需求分析 首先,我们需要对学生信息管理系统进行需求分析,明确系统的功能和需求,例如: 1. 学生信息的录入、修改、删除和查询功能。 2. 学生信息的显示和打印功能。 3. 学生信息的统计和分析功能。 4. 具有管理员和普通用户两种角色,管理员可以对学生信息进行管理,而普通用户只能浏览学生信息。 二、设计数据库 接下来,我们需要设计数据库,为系统提供数据存储和管理。在这里,我们可以使用SQL Server数据库管理系统来创建一个名为“Student”的数据库,其中包含一个名为“StudentInfo”的表,用于存储学生信息。 表的结构如下: |字段名称|字段类型|字段长度|是否允许空值| |:----:|:----:|:----:|:----:| |StudentID|nvarchar|10|否| |Name|nvarchar|20|否| |Sex|nvarchar|4|否| |Age|int|4|否| |Class|nvarchar|20|否| |Address|nvarchar|50|是| |Phone|nvarchar|20|是| 在这个表中,我们设置了一个主键StudentID,用于唯一标识每一个学生。 三、设计架构 在这里,我们采用三层架构来设计学生信息管理系统。 1. 表示层:表示层是系统与用户之间的接口,主要负责用户交互和数据展示的工作。在这里,我们使用Windows Forms技术来实现用户界面。 2. 业务逻辑层:业务逻辑层是系统的核心部分,它负责处理系统的业务逻辑,将用户的请求转化为对数据访问层的请求,并将处理结果返回给用户。在这里,我们将业务逻辑层封装为一个名为“StudentBLL”的类。 3. 数据访问层:数据访问层是系统与数据库之间的接口,主要负责对数据库进行访问和操作。在这里,我们将数据访问层封装为一个名为“StudentDAL”的类。 四、编写代码 1. 表示层代码 在表示层中,我们需要实现用户界面和事件响应等功能。在这里,我们使用Windows Forms技术来实现用户界面,例如: ```csharp // MainForm.cs public partial class MainForm : Form { private StudentBLL studentBLL = new StudentBLL(); public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { RefreshData(); } private void RefreshData() { dgvStudent.DataSource = studentBLL.GetAllStudents(); } private void btnAdd_Click(object sender, EventArgs e) { AddStudentForm addStudentForm = new AddStudentForm(); if (addStudentForm.ShowDialog() == DialogResult.OK) { Student student = new Student(); student.StudentID = addStudentForm.txtStudentID.Text; student.Name = addStudentForm.txtName.Text; student.Sex = addStudentForm.cboSex.Text; student.Age = Convert.ToInt32(addStudentForm.txtAge.Text); student.Class = addStudentForm.txtClass.Text; student.Address = addStudentForm.txtAddress.Text; student.Phone = addStudentForm.txtPhone.Text; if (studentBLL.AddStudent(student)) { MessageBox.Show("添加成功!"); RefreshData(); } else { MessageBox.Show("添加失败,请检查输入信息!"); } } } private void btnEdit_Click(object sender, EventArgs e) { if (dgvStudent.CurrentRow != null) { EditStudentForm editStudentForm = new EditStudentForm(); editStudentForm.txtStudentID.Text = dgvStudent.CurrentRow.Cells["StudentID"].Value.ToString(); editStudentForm.txtName.Text = dgvStudent.CurrentRow.Cells["Name"].Value.ToString(); editStudentForm.cboSex.Text = dgvStudent.CurrentRow.Cells["Sex"].Value.ToString(); editStudentForm.txtAge.Text = dgvStudent.CurrentRow.Cells["Age"].Value.ToString(); editStudentForm.txtClass.Text = dgvStudent.CurrentRow.Cells["Class"].Value.ToString(); editStudentForm.txtAddress.Text = dgvStudent.CurrentRow.Cells["Address"].Value.ToString(); editStudentForm.txtPhone.Text = dgvStudent.CurrentRow.Cells["Phone"].Value.ToString(); if (editStudentForm.ShowDialog() == DialogResult.OK) { Student student = new Student(); student.StudentID = editStudentForm.txtStudentID.Text; student.Name = editStudentForm.txtName.Text; student.Sex = editStudentForm.cboSex.Text; student.Age = Convert.ToInt32(editStudentForm.txtAge.Text); student.Class = editStudentForm.txtClass.Text; student.Address = editStudentForm.txtAddress.Text; student.Phone = editStudentForm.txtPhone.Text; if (studentBLL.UpdateStudent(student)) { MessageBox.Show("修改成功!"); RefreshData(); } else { MessageBox.Show("修改失败,请检查输入信息!"); } } } else { MessageBox.Show("请先选择一条记录!"); } } private void btnDelete_Click(object sender, EventArgs e) { if (dgvStudent.CurrentRow != null) { string studentID = dgvStudent.CurrentRow.Cells["StudentID"].Value.ToString(); if (MessageBox.Show("确定要删除学号为" + studentID + "的学生信息吗?", "删除确认", MessageBoxButtons.YesNo) == DialogResult.Yes) { if (studentBLL.DeleteStudent(studentID)) { MessageBox.Show("删除成功!"); RefreshData(); } else { MessageBox.Show("删除失败!"); } } } else { MessageBox.Show("请先选择一条记录!"); } } private void btnSearch_Click(object sender, EventArgs e) { string keyword = txtKeyword.Text.Trim(); dgvStudent.DataSource = studentBLL.SearchStudents(keyword); } private void btnPrint_Click(object sender, EventArgs e) { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == DialogResult.OK) { PrintDocument printDocument = new PrintDocument(); printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage); printDocument.PrinterSettings = printDialog.PrinterSettings; printDocument.Print(); } } private void printDocument_PrintPage(object sender, PrintPageEventArgs e) { Font font = new Font("宋体", 12, FontStyle.Regular); Brush brush = new SolidBrush(Color.Black); int x = e.MarginBounds.Left; int y = e.MarginBounds.Top; int rowHeight = dgvStudent.Rows[0].Height; int columnCount = dgvStudent.Columns.Count; for (int i = 0; i < columnCount; i++) { e.Graphics.DrawString(dgvStudent.Columns[i].HeaderText, font, brush, x, y); x += dgvStudent.Columns[i].Width; } y += rowHeight; for (int i = 0; i < dgvStudent.Rows.Count; i++) { x = e.MarginBounds.Left; for (int j = 0; j < columnCount; j++) { e.Graphics.DrawString(dgvStudent.Rows[i].Cells[j].Value.ToString(), font, brush, x, y); x += dgvStudent.Columns[j].Width; } y += rowHeight; } } } ``` 2. 业务逻辑层代码 在业务逻辑层中,我们需要实现系统的业务逻辑,例如: ```csharp // StudentBLL.cs public class StudentBLL { private StudentDAL studentDAL = new StudentDAL(); public DataTable GetAllStudents() { return studentDAL.GetAllStudents(); } public bool AddStudent(Student student) { if (studentDAL.GetStudentByID(student.StudentID) == null) { return studentDAL.AddStudent(student); } else { return false; } } public bool UpdateStudent(Student student) { if (studentDAL.GetStudentByID(student.StudentID) != null) { return studentDAL.UpdateStudent(student); } else { return false; } } public bool DeleteStudent(string studentID) { if (studentDAL.GetStudentByID(studentID) != null) { return studentDAL.DeleteStudent(studentID); } else { return false; } } public DataTable SearchStudents(string keyword) { return studentDAL.SearchStudents(keyword); } } ``` 3. 数据访问层代码 在数据访问层中,我们需要实现对数据库的访问和操作,例如: ```csharp // StudentDAL.cs public class StudentDAL { private string connectionString = ConfigurationManager.ConnectionStrings["Student"].ConnectionString; public DataTable GetAllStudents() { string sql = "SELECT StudentID, Name, Sex, Age, Class, Address, Phone FROM StudentInfo"; return SqlHelper.ExecuteDataTable(connectionString, CommandType.Text, sql); } public Student GetStudentByID(string studentID) { string sql = "SELECT StudentID, Name, Sex, Age, Class, Address, Phone FROM StudentInfo WHERE StudentID = @StudentID"; SqlParameter[] parameters = new SqlParameter[]{ new SqlParameter("@StudentID", studentID) }; DataTable dataTable = SqlHelper.ExecuteDataTable(connectionString, CommandType.Text, sql, parameters); if (dataTable.Rows.Count == 1) { Student student = new Student(); student.StudentID = dataTable.Rows[0]["StudentID"].ToString(); student.Name = dataTable.Rows[0]["Name"].ToString(); student.Sex = dataTable.Rows[0]["Sex"].ToString(); student.Age = Convert.ToInt32(dataTable.Rows[0]["Age"]); student.Class = dataTable.Rows[0]["Class"].ToString(); student.Address = dataTable.Rows[0]["Address"].ToString(); student.Phone = dataTable.Rows[0]["Phone"].ToString(); return student; } else { return null; } } public bool AddStudent(Student student) { string sql = "INSERT INTO StudentInfo(StudentID, Name, Sex, Age, Class, Address, Phone) VALUES(@StudentID, @Name, @Sex, @Age, @Class, @Address, @Phone)"; SqlParameter[] parameters = new SqlParameter[]{ new SqlParameter("@StudentID", student.StudentID), new SqlParameter("@Name", student.Name), new SqlParameter("@Sex", student.Sex), new SqlParameter("@Age", student.Age), new SqlParameter("@Class", student.Class), new SqlParameter("@Address", student.Address), new SqlParameter("@Phone", student.Phone) }; return SqlHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql, parameters) == 1; } public bool UpdateStudent(Student student) { string sql = "UPDATE StudentInfo SET Name = @Name, Sex = @Sex, Age = @Age, Class = @Class, Address = @Address, Phone = @Phone WHERE StudentID = @StudentID"; SqlParameter[] parameters = new SqlParameter[]{ new SqlParameter("@StudentID", student.StudentID), new SqlParameter("@Name", student.Name), new SqlParameter("@Sex", student.Sex), new SqlParameter("@Age", student.Age), new SqlParameter("@Class", student.Class), new SqlParameter("@Address", student.Address), new SqlParameter("@Phone", student.Phone) }; return SqlHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql, parameters) == 1; } public bool DeleteStudent(string studentID) { string sql = "DELETE FROM StudentInfo WHERE StudentID = @StudentID"; SqlParameter[] parameters = new SqlParameter[]{ new SqlParameter("@StudentID", studentID) }; return SqlHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql, parameters) == 1; } public DataTable SearchStudents(string keyword) { string sql = "SELECT StudentID, Name, Sex, Age, Class, Address, Phone FROM StudentInfo WHERE StudentID LIKE '%' + @Keyword + '%' OR Name LIKE '%' + @Keyword + '%'"; SqlParameter[] parameters = new SqlParameter[]{ new SqlParameter("@Keyword", keyword) }; return SqlHelper.ExecuteDataTable(connectionString, CommandType.Text, sql, parameters); } } ``` 五、总结 通过以上的介绍,我们可以看到,采用C#语言和三层架构来开发学生信息管理系统可以提高系统的可维护性、可扩展性、可重用性和可测试性等方面的优势,同时也可以有效地分离业务逻辑和数据访问层,使系统的结构更加清晰和易于维护。
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值