在 ASP.NET Core 3.1/5.0 中调用存储过程

Call a stored procedure in ASP.NET Core 3.1/5.0

我有一个简单的 ASP.NET 核心服务,它需要与数据库进行一次交互。它调用一个存储过程 returns a BigInt/long.

为此,将所有内容都启动到 运行 Entity Framework 核心似乎有点矫枉过正。特别是因为 EF Core 不能很好地执行存储过程(截至我上次检查时)。

是否有仅 .NET Core 调用和获取存储过程结果的方法(不使用 EF Core 或其他框架)?

像这样的东西是您需要的最低限度。显然,您可能希望将连接字符串存储在配置文件中。

await using DbConnection connection = new SqlConnection("Connection_String");
await connection.OpenAsync();
await using var command = connection.CreateCommand();

command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "Stored_Proc_Name";
// Declare any parameters here
var p = command.CreateParameter();
p.ParameterName = "IsCool";
p.Value = true;
p.DbType = System.Data.DbType.Boolean;
command.Parameters.Add(p);

var result = await command.ExecuteScalarAsync();
if (result == null) {
    throw new Exception("Bad");
}

long numValue = (long) result;

我在 .NET Core 5 Web 应用程序中遇到了类似的 Razor 页面问题。为了让连接字符串进入作用域,我不得不将配置注入 class。代码看起来像这样:

 public class AskSQLModel : PageModel
{

    public AskSQLModel(IConfiguration _config)
    {
        this.Configuration = _config;
    }
    public IConfiguration Configuration { get; set; }

    /// <summary>
    /// Property to hold value returned from stored procedure
    /// </summary>
    public long ReturnValue { get; set; }


    public void OnGet()
    {

        string cn = this.Configuration["ConnectionStrings:SQLConnect"];
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = new SqlConnection(cn);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = "GetLong";

        cmd.Connection.Open();
        ReturnValue = (long)cmd.ExecuteScalar();
        cmd.Connection.Close();
    }
}

Razor 页面代码如下所示:

@page
@model AskSQLModel
@{
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>This page will get a value from SQL Server.</p>

    <h4>The value is: @Model.ReturnValue</h4>

</div>

最后生成的页面显示如下:

Welcome
This page will get a value from SQL Server.

The value is: 17