簡體   English   中英

c# 如何將存儲過程參數動態傳給api

[英]c# how to pass stored procedure parameter into api dynamically

我正在使用 .net core7 minimal api 創建 web api。我創建了一個 function 來調用從數據庫中的表獲取的存儲過程。

我在將 sp 參數傳遞到 function 時遇到問題。

表格示例(web_api.dbo.app_event):

事件鍵 sp 方法 參數?
/getstorer [dbo].[sGetStorer] 得到 錯誤的
/getsku [dbo].[sGetSkuByStorer] 得到 真的

c#

using (SqlConnection con = new(strConstr))
{
    con.Open();
    using (SqlCommand cmd = new("select * from web_api.dbo.app_event where isactive=1 and method='get'", con))
    {
        using (SqlDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                string _eventkey = dr["eventkey"].ToString()!;
                string _sp = dr["sp"].ToString()!;

                app.MapGet(_eventkey, () =>
                {
                    DataTable dt = new();
                    using SqlConnection connn = new(strConstr);
                    using SqlCommand cmd3 = new(_sp, connn);
                    cmd3.CommandType = CommandType.StoredProcedure;


                    connn.Open();
                    using SqlDataAdapter da = new(cmd3);
                    da.Fill(dt);
                    var j = JsonConvert.SerializeObject(dt);
                    connn.Close();
                    return j;

                });
            };
        };
    };
    con.Close();
};

sql 對於帶有參數@storerkey 的 sGetSkuByStorer

ALTER PROCEDURE [dbo].[sGetSkuByStorer]
    @storerkey nvarchar(18)
AS
BEGIN
    SET NOCOUNT ON;
    declare @TSQL nvarchar(max)

    select @TSQL='
    select 
    * from openquery(inf27,''
    select storerkey
        ,sku
        ,descr 
    from enterprise.sku 
    where storerkey='''''+@storerkey+'''''
    '')
    '
    exec(@TSQL)
END

我想將 sp 參數放入委托處理程序中

                app.MapGet(_eventkey, (xxxxx) =>
                {
                    DataTable dt = new();
                    using SqlConnection connn = new(strConstr);
                    using SqlCommand cmd3 = new(_sp, connn);
                    cmd3.CommandType = CommandType.StoredProcedure;


                    connn.Open();
                    using SqlDataAdapter da = new(cmd3);
                    da.Fill(dt);
                    var j = JsonConvert.SerializeObject(dt);
                    connn.Close();
                    return j;

                });

最終版本

using (SqlConnection con = new(strConstr))
    {
        con.Open();
        using (SqlCommand cmd = new("select * from web_api.dbo.app_event where isactive=1 and method='get'", con))
        {
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    string _eventkey = dr["eventkey"].ToString()!;
                    string _db = dr["db"].ToString()!;
                    string _sp = dr["sp"].ToString()!;
                    string sp = _db + "." + _sp;

                    app.MapGet(_eventkey, (HttpRequest reqs) =>
                    {
                        DataTable dt = new();
                        using SqlConnection connn = new(strConstr);
                        using SqlCommand cmd3 = new(sp, connn);
                        cmd3.CommandType = CommandType.StoredProcedure;

                        foreach (var p in reqs.Query)
                        {
                            cmd3.Parameters.Add(new SqlParameter("@" + p.Key.ToString(), p.Value.ToString()));
                        }
                        connn.Open();
                        using SqlDataAdapter da = new(cmd3);
                        da.Fill(dt);
                        var j = JsonConvert.SerializeObject(dt);
                        connn.Close();
                        return j;
                    });
                };
            };
        };
        con.Close();
    };

您可以注入HttpRequest來檢索請求的信息:

app.MapGet("/foo", (HttpRequest request) =>
{
    //...

    foreach (var param in request.Query)
    {
        cmd3.Parameters.Add(new SqlParameter("@" + param.Key, param.Value.First()));
    }

    //...
})

param.Value是一個集合,因為可以像這樣調用 url:

/foo?param1=value1a&param1=value1b

然后request.Query["param1"]將是["value1a", "value1b"]

創建一個 function,它將返回帶有所需參數的Func 例如處理程序 function 解析p查詢參數並返回string可以如下所示:

Func<string, string> GetFuncForSp(string sp) => p =>
{
   // call sp:
   DataTable dt = new();
   using SqlConnection connn = new(strConstr);
   using SqlCommand cmd3 = new(sp, connn);
   // ...
}

和用法:

app.MapGet(_eventkey, GetFuncForSp(_sp));

暫無
暫無

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

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