簡體   English   中英

如何使用 Pomelo/Entity 從存儲過程中獲取 SELECT COUNT(*) 的結果

[英]How to get the result of SELECT COUNT(*) from a stored procedure using Pomelo/Entity

我正在使用 ASP NET core 5.0 並使用 Pomelo 來處理 MariaDB 數據庫

我有一個存儲過程,它接受一堆參數並返回一個 SELECT COUNT(*),所以一個不錯的簡單 integer。 我認為這將是相當微不足道的,但事實證明這實際上非常困難

我可以通過執行以下操作來做一個非常丑陋的解決方法:

Database.GetDbConnection().Open();

using (var x = Database.GetDbConnection().CreateCommand())
{
    x.CommandText = "test";
    x.CommandType = System.Data.CommandType.StoredProcedure;

    var q = await x.ExecuteScalarAsync();

    Console.WriteLine(q);
}

但我真的不想打開和關閉連接,因為這只是 janky

我以為我可以使用 Database.ExecuteSqlRaw[async],但它的返回值是受影響的行,而不是查詢的實際 output。 我嘗試了各種獲取返回值的嘗試,其中大多數都拋出異常,而其他的則什么都不做。

那么,有沒有一種整潔的方法可以做到這一點,還是我有一個笨拙的解決方法?

這幾乎是推薦的方法,只需將Database.GetDbConnection().Open()替換為Database.OpenConnectionAsync() ,以便 EF Core 為您管理連接並在不再需要時將其關閉(否則,如果連接尚未由 EF Core 打開,您突然負責稍后關閉它)。

將所有內容放在擴展方法中以便於重用並繼續:

public static async Task<T> GetScalarStoredProcedureResultAsync<T>(
    this DbContext context,
    string name)
{
    await context.Database.OpenConnectionAsync();
    var connection = context.Database.GetDbConnection();

    using var command = connection.CreateCommand();
    command.CommandText = name;
    command.CommandType = System.Data.CommandType.StoredProcedure;

    return (T) await command.ExecuteScalarAsync();
}

電話是:

var count = yourContext.GetScalarStoredProcedureResultAsync<long>("test");
Console.WriteLine(count);

編輯

哇,剛剛意識到你已經這樣做了。 但是,是的,你沒有打開一個新的連接。 EF 仍在管理連接。 您可以修改存儲過程以使用 output 參數,或保持原樣。

原始答案

您不必手動打開新連接。 使用附加到上下文的連接 object。 這是從另一個 SO 答案中提取的:

using (var cmd = _context.Database.GetDbConnection().CreateCommand()) {
    cmd.CommandText = "[Production].[Select_TicketQuantity]";
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    if (cmd.Connection.State != System.Data.ConnectionState.Open) cmd.Connection.Open();
    cmd.Parameters.Add(new SqlParameter("Ticket", ticket));
    cmd.Parameters.Add(new SqlParameter("Reference", reference));
    quantity = (int)cmd.ExecuteScalar();
}

在這里查看答案: https://stackoverflow.com/a/59627588/12431728

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM