3

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 のパラメータの順序を尊重する必要があります。CommandType.StoredProcedure ではなく CommandType=CommandType.Text を使用して SP が実行され、パラメータが dbCmd.Parameters.Add() として追加されるためだと思います。CommandType が Text であるため、名前付けを無視するため、Parameters.Add() としてではなく、SQL クエリ文字列にパラメーターが追加されることを期待しているようです。例:

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});

名前付きパラメーターを無視し、SP で定義されている順序で追加するため、SyncStatus=1 ではなく JobNo = 1 のすべてのレコードが返されます。次のように呼び出す必要があります。

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

これは予想される動作ですか?信頼できない場合、匿名型パラメーターを無効にすると思います

ティア

ボー

4

1 に答える 1

3

私の解決策は、ストアド プロシージャに独自のメソッドを展開することでした。人々がそれらを便利だと思ったら、プロジェクトに追加できます

    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 の変更されたバージョンです。

于 2013-03-20T12:38:42.837 に答える