25

InsertCarsユーザー定義のテーブル タイプのリストを受け入れるストアド プロシージャがありますCarType

CREATE TYPE dbo.CarType
AS TABLE
(
    CARID int null,
    CARNAME varchar(800) not null,
);

CREATE PROCEDURE dbo.InsertCars
    @Cars AS CarType READONLY
AS
-- RETURN COUNT OF INSERTED ROWS
END

このストアド プロシージャを Dapper から呼び出す必要があります。私はそれをグーグルで検索し、いくつかの解決策を見つけました。

 var param = new DynamicParameters(new{CARID= 66, CARNAME= "Volvo"});

 var result = con.Query("InsertCars", param, commandType: CommandType.StoredProcedure);

しかし、私はエラーが発生します:

プロシージャまたは関数 InsertCars に指定された引数が多すぎます

また、ストアド プロシージャInsertCarsは挿入された行の数を返します。この値を取得する必要があります。

問題の根源はどこにある?

私の問題は、ジェネリックリストに車があり、List<Car> Carsこのリストをストアプロシージャに渡したいということです。エレガントな方法でそれを行う方法はありますか?

public class Car
{
    public CarId { get; set; }
    public CarName { get; set; }
}

ご協力ありがとう御座います

編集済み

解決策を見つけました

Dapper は SQL 2008 テーブル値パラメーターをサポートしていますか?

また

Dapper は SQL 2008 テーブル値パラメーター 2 をサポートしていますか?

だから私は自分の愚かなヘルパークラスを作ってみます

class CarDynamicParam : Dapper.SqlMapper.IDynamicParameters
{
    private Car car;

    public CarDynamicParam(Car car)
    {
        this.car = car;
    }

    public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
    {
        var sqlCommand = (SqlCommand)command;

        sqlCommand.CommandType = CommandType.StoredProcedure;

        var carList = new List<Microsoft.SqlServer.Server.SqlDataRecord>();

        Microsoft.SqlServer.Server.SqlMetaData[] tvpDefinition =
                                                                {

                                                                    new Microsoft.SqlServer.Server.SqlMetaData("CARID", SqlDbType.Int),
                                                                    new Microsoft.SqlServer.Server.SqlMetaData("CARNAME", SqlDbType.NVarChar, 100),
                                                                };

        var rec = new Microsoft.SqlServer.Server.SqlDataRecord(tvpDefinition);
        rec.SetInt32(0, car.CarId);
        rec.SetString(1, car.CarName);

        carList.Add(rec);

        var p = sqlCommand.Parameters.Add("Cars", SqlDbType.Structured);
        p.Direction = ParameterDirection.Input;
        p.TypeName = "CarType";
        p.Value = carList;
    }
}

使用する

var result = con.Query("InsertCars", new CarDynamicParam(car), commandType: CommandType.StoredProcedure);

例外が発生します

マルチマッピング API を使用する場合、ID 以外のキーがある場合は、必ず splitOn パラメータを設定してください。

スタックトレース:

   at Dapper.SqlMapper.GetDynamicDeserializer(IDataRecord reader, Int32 startBound, Int32 length, Boolean returnNullIfFirstMissing) in c:\Dev\Dapper\Dapper\SqlMapper.cs:line 1308
   at Dapper.SqlMapper.GetDeserializer(Type type, IDataReader reader, Int32 startBound, Int32 length, Boolean returnNullIfFirstMissing) in c:\Dev\Dapper\Dapper\SqlMapper.cs:line 1141
   at Dapper.SqlMapper.<QueryInternal>d__d`1.MoveNext() in c:\Dev\Dapper\Dapper\SqlMapper.cs:line 819
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in c:\Dev\Dapper\Dapper\SqlMapper.cs:line 770
   at Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in c:\Dev\Dapper\Dapper\SqlMapper.cs:line 715

なにが問題ですか?

修繕:

con.Execute代わりに電話するcon.Query

4

7 に答える 7

18

これが少し古いことは知っていますが、これを少し簡単にしようとしたので、とにかくこれに投稿すると思いました. 次のようなコードを許可するように作成した NuGet パッケージでそれができたことを願っています。

public class CarType
{
  public int CARID { get; set; }
  public string CARNAME{ get; set; }
}

var cars = new List<CarType>{new CarType { CARID = 1, CARNAME = "Volvo"}};

var parameters = new DynamicParameters();
parameters.AddTable("@Cars", "CarType", cars)

 var result = con.Query("InsertCars", parameters, commandType: CommandType.StoredProcedure);

NuGet パッケージ: https://www.nuget.org/packages/Dapper.ParameterExtensions/0.2.0 まだ初期段階であるため、すべてが機能するとは限りません。

README を読んで、お気軽に GitHub に貢献してください: https://github.com/RasicN/Dapper-Parameters

于 2016-12-28T18:13:01.650 に答える