gpt4 book ai didi

servicestack - 使用参数调用存储过程时出现 SqlScalar 和 SqlList 问题

转载 作者:行者123 更新时间:2023-12-03 09:25:47 27 4
gpt4 key购买 nike

Servicestack.OrmLite 的新 API 规定,当调用 fx 存储过程时,您应该像这样使用 SqlScalar 或 SqlList:

List<Poco> results = db.SqlList<Poco>("EXEC GetAnalyticsForWeek 1");
List<Poco> results = db.SqlList<Poco>("EXEC GetAnalyticsForWeek @weekNo", new { weekNo = 1 });

List<int> results = db.SqlList<int>("EXEC GetTotalsForWeek 1");
List<int> results = db.SqlList<int>("EXEC GetTotalsForWeek @weekNo", new { weekNo = 1 });

但是命名参数不起作用。您必须遵守 SP 中参数的顺序。我认为这是因为SP是使用CommandType=CommandType.Text而不是CommandType.StoredProcedure执行的,并且参数被添加为dbCmd.Parameters.Add()。似乎因为 CommandType 是文本,所以它希望将参数添加到 SQL 查询字符串中,而不是作为 Parameters.Add(),因为它忽略了命名。一个例子:

CREATE PROCEDURE [dbo].[sproc_WS_SelectScanFeedScanRecords] 
@JobNo int = 0
,@SyncStatus int = -1
AS
BEGIN
SET NOCOUNT ON;
SELECT
FSR.ScanId
, FSR.JobNo
, FSR.BatchNo
, FSR.BagNo
, FSR.ScanType
, FSR.ScanDate
, FSR.ScanTime
, FSR.ScanStatus
, FSR.SyncStatus
, FSR.JobId
FROM dbo.SCAN_FeedScanRecords FSR
WHERE ((FSR.JobNo = @JobNo) OR (@JobNo = 0) OR (ISNULL(@JobNo,1) = 1))
AND ((FSR.SyncStatus = @SyncStatus) OR (@SyncStatus = -1) OR (ISNULL(@SyncStatus,-1) = -1))
END

当这样调用这个 SP 时:

db.SqlList<ScanRecord>("EXEC sproc_WS_SelectScanFeedScanRecords @SyncStatus",new {SyncStatus = 1});

它返回 JobNo = 1 而不是 SyncStatus = 1 的所有记录,因为它忽略了命名参数并按照它们在 SP 中定义的顺序添加。我必须这样调用它:

db.SqlList<ScanRecord>("EXEC sproc_WS_SelectScanFeedScanRecords @SyncStatus=1");

这是预期的行为吗?如果我不相信它,我认为它会破坏匿名类型参数

TIA

最佳答案

我的解决方案是为存储过程推出我自己的方法。如果人们发现它们很方便,我可以将它们添加到项目中

    public static void StoredProcedure(this IDbConnection dbConn, string storedprocedure, object anonType = null)
{
dbConn.Exec(dbCmd =>
{
dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd.CommandText = storedprocedure;
dbCmd.SetParameters(anonType, true);
dbCmd.ExecuteNonQuery();
});
}
public static T StoredProcedureScalar<T>(this IDbConnection dbConn, string storedprocedure, object anonType = null)
{
return dbConn.Exec(dbCmd =>
{
dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd.CommandText = storedprocedure;
dbCmd.SetParameters(anonType, true);
using (IDataReader reader = dbCmd.ExecuteReader())
return GetScalar<T>(reader);
});
}
public static List<T> StoredProcedureList<T>(this IDbConnection dbConn, string storedprocedure, object anonType = null)
{
return dbConn.Exec(dbCmd =>
{
dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd.CommandText = storedprocedure;
dbCmd.SetParameters(anonType, true);
using (var dbReader = dbCmd.ExecuteReader())
return IsScalar<T>()
? dbReader.GetFirstColumn<T>()
: dbReader.ConvertToList<T>();
});
}

它们只是 SqlScalar 和 SqlList 加上 ExecuteNonQuery 的修改版本

关于servicestack - 使用参数调用存储过程时出现 SqlScalar<T> 和 SqlList<T> 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15519270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com