[英]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¶m1=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.