C# WinForms存储过程操作数据库的实例讲解

2025-04-02 16:50

本文主要是介绍C# WinForms存储过程操作数据库的实例讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...

在 C# WinForms 中通过存储过程操作数据库是提高应用性能和安全性的重要手段。

以下为详细解析和完整示例:

一、存储过程基础

优势

  • 预编译执行,性能更优
  • 防止SQL注入攻击
  • 减少网络传输数据量
  • 便于集中管理业务逻辑

创建示例​(SQL Server):

CREATE PROCEDURE sp_AddEmployee
    @Name NVARCHAR(50),
    @Age INT,
    @Email NVARCHAR(100),
    @NewID INT OUTPUT
AS
BEGIN
    INSERT INTO Employees (Name, Age, Email) 
    VALUES (@Name, @Age, @Email)
    
    SET @NewID = SCOPE_IDENTITY()
END

二、C# 调用流程

1. 数据库连接配置

using System.Data;
using System.Data.SqlClient;

string connectionString = "Server=.;Database=YourDB;Integrated Security=True;";

2. 执行存储过程(增删改)

public bool AddEmployee(string name, int age, string email, out int newId)
{
    using (SqlConnection conn = new SqlCohttp://www.chinasem.cnnnection(connectionString))
    {
        try
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("sp_AddEmployee", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                
                // 输入参数
                cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = name;
                cmd.Parameters.Add("@Age", SqlDbType.Int).Value = age;
                cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 100).Value = email;
                
                // 输出参数
                SqlParameter outputParam = new SqlParameter("@NewID", SqlDbType.Int)
                {
                    Direction = ParameterDirection.Output
                };
                cmd.Parameters.Add(outputParam);

                cmd.ExecuteNonQuery();
                
                newId = (int)outputParam.Value;
                return true;
            }
        }
        catch (SqlException ex)
        {
            MessageBox.Show($php"数据库错误: {ex.Message}");
            newId = -1;
            return false;
        }
    }
}

3. 查询数据

public DataTable GetEmployees(int minAge)
{
    DataTable dt = new DataTable();
    
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        phpusing (SqlCommand cmd = new SqlCommand("sp_GetEmployees", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddwithValue("@MinAge", minAge);

            androidSqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
        }
    }
    
    return dt;
}

三、事务处理

public bool UpdateEmployeeTransaction(int id, string newName)
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        SqlTransaction transaction = conn.BeginTransaction();
        
        try
        {
            using (SqlCommand cmd = new SqlCommand("sp_UpdateEmployee", conn, transaction))
            {
                cmd.Parameters.AddWithValue("@ID", id);
                cmd.Parameters.AddWithValue("@NewName", newName);
                cmd.ExecuteNphponQuery();
            }
            
            transaction.Commit();
            return true;
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            MessageBox.Show($"操作失败: {ex.Message}");
            return false;
        }
    }
}

四、关键注意事项

参数安全

  • 必须使用参数化查询
  • 明确指定参数类型和长度

资源管理

using (SqlConnection conn = new SqlConnection(...))
using (SqlCommand cmd = new SqlCommand(...))
{
    // 自动释放资源
}

错误处理

try 
{
    // 数据库操作
}
catch (SqlException ex)
{
    // 处理数据库特有错误
    if (ex.Number == 547) // 外键约束错误
}
catch (Exception ex)
{
    // 常规异常处理
}

性能优化

  • 存储过程内使用SET NOCOUNT ON
  • 避免在存储过程中进行复杂计算
  • 合理创建索引

五、典型存储过程类型

  1. 数据操作:INSERT/UPDATE/DELETE
  2. 查询返回:单结果集/多结果集
  3. 分页查询:使用ROW_NUMBER()实现
  4. 业务处理:包含事务的多表操作

完整示例可在实际项目中直接使用,注意根据实际情况:

  1. 修改连接字符串
  2. 调整参数类型和长度
  3. 添加具体的业务逻辑处理
  4. 完善异常日志记录功能

通过存储过程实现数据访问层,可使WinForms应用程序更易维护,同时提升安全性和执行效率。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于C# WinForms存储过程操作数据库的实例讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154062

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1