[英]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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.