Entity Framework Core执行存储过程

这节讲解EF Core中使用FromSqlRaw()& ExecuteCommand() 反复执行存储过程 

1 存储过程

下面存储过程返回指定 name和standard 所有学生,name&standard值通过存储过程的输入参数提供

CREATE PROCEDURE [dbo].[sp_GetStudents]
    @Name       VARCHAR(50),
    @Standard   INT
AS
BEGIN
    SELECT * FROM Student Where Name=@Name AND Standard=@Standard
END

Entity Framework Core 使用FromSqlRaw() 方法执行存储过,使用FromSqlRaw()方法时必须为存储过程提供两个参数,因此我们必须使用SqlParameter 数组设置参数

SqlParameter类位于Microsoft.Data.SqlClient命名空间内,下面代码执行存储过程

var param = new SqlParameter[] {
                        new SqlParameter() {
                            ParameterName = "@Name",
                            SqlDbType =  System.Data.SqlDbType.VarChar,
                            Size = 100,
                            Direction = System.Data.ParameterDirection.Input,
                            Value = "Tony"
                        },
                        new SqlParameter() {
                            ParameterName = "@Standard",
                            SqlDbType =  System.Data.SqlDbType.Int,
                            Direction = System.Data.ParameterDirection.Input,
                            Value = 10
                        }};
List<Student> studentList = context.Student.FromSqlRaw("[dbo].[sp_GetStudents] @Name, @Standard", param).ToList();

2 存储过程返回多个数据集

.FromSqlRaw()方法将从存储过程中获取一条记录,如果存储过程返回多个数据集,我们使用 ExecuteReader() 方法

下面存储过程返回两组数据集,一个是Student表,另一个是StudentAddress表

CREATE PROCEDURE [dbo].[sp_MultiRecordSets]
    @IdStu   INT,
    @IdAdd   INT 
AS
BEGIN
    SELECT * FROM Student Where Id=@IdStu 
    SELECT * FROM StudentAddress WHERE Id=@IdAdd
END

下面代码显示了如何使用ExecuteReader() 方法从这两组数据中获取值

var param = new SqlParameter[] {
                        new SqlParameter() {
                            ParameterName = "@IdStu",
                            SqlDbType =  System.Data.SqlDbType.Int,
                            Direction = System.Data.ParameterDirection.Input,
                            Value = 5
                        },
                        new SqlParameter() {
                            ParameterName = "@IdAdd",
                            SqlDbType =  System.Data.SqlDbType.Int,
                            Direction = System.Data.ParameterDirection.Input,
                            Value = 10
                        }};
var context = new SchoolContext();
using (var cnn = context.Database.GetDbConnection())
{
    var cmm = cnn.CreateCommand();
    cmm.CommandType = System.Data.CommandType.StoredProcedure;
    cmm.CommandText = "[dbo].[sp_MultiRecordSets]";
    cmm.Parameters.AddRange(param);
    cmm.Connection = cnn;
    cnn.Open();
    var reader = cmm.ExecuteReader();
    while (reader.Read())
    {
       // name from student table 
       string studentName= Convert.ToString(reader["Name"]); 
    }
    reader.NextResult(); //move the next record set
    while (reader.Read())
    {
        // city from student address table
        string city = Convert.ToString(reader["City"]); 
    }
}

注意使用NextResult()移动到下一组数据集

EF Core中三个最重要的概念:

1 DbContext类

2 Migrations

3 Fluent APIs

3 使用ExecuteSqlRawAsync()执行存储过程和原生SQL

EF Core使用ExecuteSqlRawAsync() 方法执行存储过程和原生SQL,但是不像FromSqlRaw()方法,它返回受影响的行数,注意也有一个ExecuteSqlRaw() 同步版本类型的方法

var rowsAffected = await context.Database.ExecuteSqlRawAsync("Update Students set Name = 'Donald Trump' where Id = 5");

4 使用ExecuteSqlRawAsync()输出存储过程参数

我们使用存储过程返回生总个数(@TotalStudents)

CREATE PROCEDURE [dbo].[sp_GetStudentsNew]
    @Name               VARCHAR(50),
    @Standard           INT,
    @TotalStudents      INT            OUTPUT
AS
BEGIN
    SELECT * FROM Student Where Name=@Name AND Standard=@Standard
    SET @TotalStudents= (SELECT COUNT(*) FROM Student)
END

为了执行存储过程在EF Core,我们需要指定SqlParameter参数的输出方向

new SqlParameter() {
    ParameterName = "@TotalStudents",
    SqlDbType =  System.Data.SqlDbType.Int,
    Direction = System.Data.ParameterDirection.Output, // direction output
}

每次执行存储过程时,我们能通过输出参数获取到返回的值:

int totalStudents = Convert.ToInt32(Convert.ToString(param[2].Value));

注意:参数的开始索引是0,总共有三个参数,最后一个参数是输出参数

var context = new SchoolContext();
var param = new SqlParameter[] {
                        new SqlParameter() {
                            ParameterName = "@Name",
                            SqlDbType =  System.Data.SqlDbType.VarChar,
                            Size = 100,
                            Direction = System.Data.ParameterDirection.Input,
                            Value = "Tony"
                        },
                        new SqlParameter() {
                            ParameterName = "@Standard",
                            SqlDbType =  System.Data.SqlDbType.Int,
                            Direction = System.Data.ParameterDirection.Input,
                            Value = 10
                        },
                        new SqlParameter() {
                            ParameterName = "@TotalStudents",
                            SqlDbType =  System.Data.SqlDbType.Int,
                            Direction = System.Data.ParameterDirection.Output,
                        }};
int affectedRows = await context.Database.ExecuteSqlRawAsync("[dbo].[sp_GetStudentsNew] @Name, @Standard, @TotalStudents out", param);
int totalStudents = Convert.ToInt32(param[2].Value);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ADO.NET Core中,可以使用Oracle.ManagedDataAccess.Core包来连接Oracle数据库,并调用存储过程。下面是一个简单的示例: 1. 首先,需要在项目中安装Oracle.ManagedDataAccess.Core包。可以通过NuGet包管理器或命令行进行安装: ``` Install-Package Oracle.ManagedDataAccess.Core ``` 2. 在代码中,创建一个OracleConnection对象并打开连接: ```csharp using Oracle.ManagedDataAccess.Client; ... var connectionString = "Data Source=your_data_source;User Id=your_username;Password=your_password;"; using (var connection = new OracleConnection(connectionString)) { connection.Open(); //调用存储过程 } ``` 3. 使用OracleCommand对象创建一个存储过程的调用: ```csharp using Oracle.ManagedDataAccess.Client; ... var connectionString = "Data Source=your_data_source;User Id=your_username;Password=your_password;"; using (var connection = new OracleConnection(connectionString)) { connection.Open(); using (var command = new OracleCommand("your_stored_procedure_name", connection)) { command.CommandType = CommandType.StoredProcedure; //添加存储过程的参数 command.Parameters.Add("param1", OracleDbType.Varchar2, ParameterDirection.Input).Value = "value1"; command.Parameters.Add("param2", OracleDbType.Varchar2, ParameterDirection.Input).Value = "value2"; command.Parameters.Add("param3", OracleDbType.RefCursor, ParameterDirection.Output); //执行存储过程并读取结果 using (var reader = command.ExecuteReader()) { while (reader.Read()) { //处理结果 } } } } ``` 在这个示例中,我们调用了一个名为"your_stored_procedure_name"的存储过程,并传递了三个参数。其中,第三个参数是一个游标类型的输出参数,用于返回存储过程的结果集。 需要注意的是,需要根据实际情况调整连接字符串和存储过程的参数。同时,也可以使用其他方式调用存储过程,比如使用Entity Framework Core的FromSqlRaw方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值