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 是 Text,它希望将参数添加到 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
博