Sql储存过程Csharp的使用

本文详细介绍了如何在C#中使用SQL存储过程,包括创建无参数的`usp_ScoreQuery1`和带默认值参数的`usp_ScoreQuery4`。讨论了存储过程在提高代码可读性、防止SQL注入攻击方面的优点。
摘要由CSDN通过智能技术生成

存储过程的使用

SQL创建储存全过程

自定义无参数存储过程:

-- 查询考试成绩,显示:学号、姓名、班级、总成绩,并按成绩的总分高低排序。
-- 统计分析考试成绩,显示班级名称、C#平均分、数据库平均分,按照班级分组实现。
 use SMDB
 go
 if exists (select * from sysobjects where name = 'usp_ScoreQuery1')
 drop procedure usp_ScoreQuery1
 go
 create procedure usp_ScoreQuery1
 as
 	   -- 查询考试成绩
 	   select Students.StudentId,StudentName,ClassName, ScoreSum = (CSharp + SqlserverDB) from Students
 	   inner join StudentClass on StudentClass.ClassId = Students.ClassId
 	   inner join ScoreList on ScoreList.StudentId = Students.StudentId
 	   order by ScoreSum DESC
 	   -- 分析考试信息
 	   select ClassName,C#Avg=AVG(CSharp),DBAvg=AVG(SqlserverDB) from ScoreList
 	   inner join Students on Students.StudentId = ScoreList.StudentId
 	   inner join StudentClass on StudentClass.ClassId = Students.ClassId
 	   group by ClassName
 	   order by ClassName
 go
 --执行存储过程:
use SMDB
go
exec usp_ScoreQuery1
-- 针对上面实现的效果,继续修改,改为参数可以带默认值
use SMDB
go
if exists (select * from sysobjects where name = 'usp_ScoreQuery4')
drop procedure usp_ScoreQuery4
go
create procedure usp_ScoreQuery4
	-- 带默认值
	@CSharp int = 60,
	@SqlserverDB int = 60
as
	select Students.StudentId,StudentName,CSharp as C#,SqlserverDB as DB from ScoreList
	inner join Students on Students.StudentId = ScoreList.StudentId
	where CSharp < @CSharp or SqlserverDB < @SqlserverDB
go

在Csharp进行存储过程的使用

存储过程在应用程序端的使用的优点:

1.如果sql语句直接写在客户端,以一个字符串的形式体现的,提示不友好,会导致效率降低

2.sql语句写在客户端,可以利用sql注入进行攻击,为了安全性,可以把sql封装在服务器存储过程,在客户端进行调用即可

在C#窗体应用里面添加button(按钮) ,输入框(textBox),dataGridView

首先连接数据库

public string connString = @"Server = 192.168.113.74,51187\SQLEXPRESS;DataBase = SMDB;   Uid=sa;Pwd=123456";

Csharp过程

namespace 存储过程的使用
{
    public partial class Form1 : Form
    {
        // 连接数据库
        public string connString = @"Server = 192.168.113.74,51187\SQLEXPRESS;DataBase = SMDB;   Uid=sa;Pwd=123456";
        public SqlConnection conn;
        public Form1()
        {
            InitializeComponent();
            // 存储过程在应用程序端的使用的优点
            // 1 如果sql语句直接写在客户端,以一个字符串的形式体现的,表示不友好,会导致效率降低
            // 2 sql语句写在客服端,可以利用sql注入进行攻击,为了安全性,可以把sql封装在服务器存储过程 在客户端进行调用即可
            conn = new SqlConnection(connString);
            conn.Open();
        }

        // 无参数的存储过程的调用
        private void button1_Click(object sender, EventArgs e)
        {
            //1 定义存储过程名称
            string proceName = "usp_ScoreQuery1";
            //2 创建一个指定对象
            SqlCommand cmd = new SqlCommand();
            //3 执行存储过程
            cmd.CommandText = proceName;// 添加执行的sql
            cmd.Connection = conn;// 设置连接对象
            //4 执行命令类型
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            //5 取出数据
            List<Model1> model1s = new List<Model1>();// 存储第一个表的数据
            List<Model2> models2 = new List<Model2>();// 存储第二个表的数据
            try
            {
                SqlDataReader dr = cmd.ExecuteReader();// 读数据库数据
                while (dr.Read())
                {
                    model1s.Add(new Model1(){
                        StudentId = Convert.ToInt32(dr["StudentId"]),
                        StudentName = dr["StudentName"].ToString(),
                        ClassName = dr["ClassName"].ToString(),
                        ScoreNum = Convert.ToInt32(dr["ScoreSum"])
                    });
                }
                // 如果有第二个数据源 读取第二个select
                if (dr.NextResult())
                {
                    while (dr.Read())
                    {
                        models2.Add(new Model2()
                        {
                            ClassName = dr["ClassName"].ToString(),
                            CSharpAvg = Convert.ToInt32(dr["C#Avg"]),
                            DBAge = Convert.ToInt32(dr["DBAvg"]),
                        });
                    }
                }
                dr.Close();
                this.dataGridView1.DataSource = model1s;
                this.dataGridView2.DataSource = models2;
            }
            catch 
            {
                throw;
            }
        }
        public class Model1
        {
            public int StudentId { get; set; }
            public string StudentName { get; set; }
            public string ClassName { get; set; }
            public int ScoreNum { get; set; }

        }
        public class Model2
        {
            public string ClassName { get; set; }
            public int CSharpAvg { get; set; }
            public int DBAge { get; set; }

        }
        public class Model3
        {
            public int StudentId { get; set; }
            public string StudentName { get; set; }
            public int CSharp { get; set; }
            public int DB { get; set; }
        }
        // 带输入参数的存储过程使用
        private void button2_Click(object sender, EventArgs e)
        {
            // 1指定存储过程
            string proceName = "usp_ScoreQuery4";
            // 2 创建指令对象
            SqlCommand cmd = new SqlCommand(proceName);
            // 3 设置连接和设置执行过程
            cmd.Connection = conn;
            cmd.CommandText = proceName;
            // 4 执行类型
            cmd.CommandType = CommandType.StoredProcedure;
            // 5 设置输入参数
            // 定义参数方法1
            SqlParameter csharp = new SqlParameter();
            csharp.ParameterName = "@CSharp";// 设置csharp是存储过程中对应@CSharp输入参数
            csharp.Direction = ParameterDirection.Input;// 设置为输入参数
            csharp.Value = 70;// 设置参数的值为70
            csharp.SqlDbType = SqlDbType.Int;// 设置参数类型
            cmd.Parameters.Add(csharp); // 把输入参数添加到参数列表里面

            // 定义参数方法2 @SqlserverDB
            cmd.Parameters.Add(new SqlParameter()
            {
                ParameterName = "@SqlserverDB",
                Direction = ParameterDirection.Input,
                Value = 80,
                SqlDbType = SqlDbType.Int,
            });
            // 6 获取数据
            List<Model3> list = new List<Model3>();
            try
            {
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    list.Add(new Model3()
                    {
                        StudentId = Convert.ToInt32(dr["StudentId"]),
                        StudentName = dr["StudentName"].ToString(),
                        CSharp = Convert.ToInt32(dr["C#"]),
                        DB = Convert.ToInt32(dr["DB"]),
                    });
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        // 调用带输出参数的存储过程 对应的是model3对象
        private void button3_Click(object sender, EventArgs e)
        {
            string proceName = "usp_ScoreQueery5";
            SqlCommand cmd = new SqlCommand(proceName, conn);
            // cmd.CommandText = proceName;
            // cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;

            // 设置输入参数
            cmd.Parameters.Add(new SqlParameter()
            {
                ParameterName = "@AbsentCount",
                Direction = ParameterDirection.Output,
                SqlDbType = SqlDbType.Int,
            });
            // 输入参数
            cmd.Parameters.Add(new SqlParameter()
            {
                ParameterName = "@CSharp",
                Direction = ParameterDirection.Output,
                SqlDbType = SqlDbType.Int,
                Value = 80
            });
            cmd.Parameters.Add(new SqlParameter()
            {
                ParameterName = "@SqlserverDB",
                Direction = ParameterDirection.Input,
                SqlDbType = SqlDbType.Int,
                Value = 80
            });
            // 取数据
            List<Model3> list = new List<Model3>();
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                list.Add(new Model3()
                {
                    StudentId = Convert.ToInt32(dr["StudentId"]),
                    StudentName = dr["StudentName"].ToString(),
                    CSharp = Convert.ToInt32(dr["C#"]),
                    DB = Convert.ToInt32(dr["DB"]),
                });
            }
            dr.Close();
            this.dataGridView1.DataSource = list;
            // 输入参数的值怎么取?缺考总人数?不及格人数?
            this.label1.Text = "缺考总人数:" + cmd.Parameters["@AbsentCount"].Value.ToString() + "人";
            this.label2.Text = "不及格总人数:" + cmd.Parameters["@FailCount"].Value.ToString() + "人";
        }
    }
}

总结

1 不带参数存储过程的使用 
   1.1指定存储过程名称
    string proceName = "usp_ScoreQuery5";
   1.2创建指令对象传递连接对象和存储过程
     SqlCommand cmd = new SqlCommand(proceName,conn);
   1.3 指定指令执行类型
    cmd.CommandType = CommandType.StoredProcedure;
   1.4 执行指令
   SqlDataReader dr = cmd.ExecuteReader();
  
  2 带输入参数的存储过程的调用
  2.1指定存储过程名称
    string proceName = "usp_ScoreQuery5";
   2.2创建指令对象传递连接对象和存储过程
     SqlCommand cmd = new SqlCommand(proceName,conn);
   2.3 指定指令执行类型
    cmd.CommandType = CommandType.StoredProcedure;
   2.4 添加输入参数
    cmd.Parameters.Add(new SqlParameter()
            {
                ParameterName = "@CSharp",
                Direction = ParameterDirection.Input,
                SqlDbType = SqlDbType.Int,
                Value = 80
            });
   2.5执行指令
   SqlDataReader dr = cmd.ExecuteReader();
  
  
  3 带输入参数带输出参数的调用
    添加输出参数即可
    cmd.Parameters.Add(new SqlParameter()
            {
                ParameterName = "@AbsentCount",
                Direction = ParameterDirection.Output,
                SqlDbType = SqlDbType.Int,
            });
  获取输出参数的值
       cmd.Parameters["@AbsentCount"].Value.ToString()

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server存储过程是一组预编译的SQL语句,可以在数据库中创建并保存,以供以后重复使用。存储过程可以接受参数,并且可以返回结果。它们可以用于执行复杂的数据库操作,提高性能和安全性。 在SQL Server中,可以使用CREATE PROCEDURE语句来创建存储过程。存储过程可以包含SQL语句、控制流语句、变量和参数等。可以使用EXECUTE语句来调用存储过程,并传递参数。 例如,使用C#语言调用存储过程可以使用以下代码: ```csharp public static double GetBalance(string accountName) { SqlConnection conn; string cs = ConfigurationManager.ConnectionStrings\["sampleDB"\].ConnectionString; conn = new SqlConnection(cs); conn.Open(); SqlParameter\[\] paras = new SqlParameter\[2\]; paras\[0\] = new SqlParameter("@accountName", accountName); paras\[1\] = new SqlParameter("@balance", System.Data.SqlDbType.Float); paras\[1\].Direction = System.Data.ParameterDirection.Output; SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "GetBalance"; for (int i = 0; i < paras.Length; i++) { cmd.Parameters.Add(paras\[i\]); } int n = cmd.ExecuteNonQuery(); object o = cmd.Parameters\["@balance"\].Value; return Convert.ToDouble(o); } ``` 这段代码使用C#语言连接到数据库,并调用名为"GetBalance"的存储过程。它传递一个名为"accountName"的参数,并接收一个名为"balance"的输出参数。最后,它将输出参数的值转换为double类型并返回。 总之,SQL Server存储过程是一种在数据库中创建和保存的预编译SQL语句的集合,可以通过执行语句来调用并传递参数。 #### 引用[.reference_title] - *1* [SQL Server基础之存储过程](https://blog.csdn.net/q751681219/article/details/125267448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SQL Sever数据库存储过程](https://blog.csdn.net/aqiuisme/article/details/123177083)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [关于SQL Server 存储过程的一点问题](https://blog.csdn.net/weixin_33704234/article/details/85470101)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值