4

私は TVP を使用しており、データ テーブルを TVP としてストアド プロシージャに渡そうとしています。コマンドが を実行しようとするとExecuteNonQuery()、エラーがスローされます。

オペランド タイプの衝突: datetime2 は int と互換性がありません。テーブル値パラメーター "@tvpPermitWork" のデータは、パラメーターのテーブル型に準拠していません。

ビジュアライザーを使用してデータ テーブルを確認したところ、すべてのデータが正しいことがわかりました。私は今行き詰まっており、個々のパラメーターを持つストアド プロシージャに変更する時間がありません。

これを修正する方法についての提案は大歓迎です。

4

4 に答える 4

7

この問題の解決策を見つけました。

TVP および C# コードで一致する列の順序を確認する必要があります。

たとえば、次のような TVP があるとします。

CREATE TYPE [dbo].[tvp_FinDocContract] AS TABLE(
    [column_1_Id] [uniqueidentifier] NOT NULL,
    [column_2_Id] [uniqueidentifier] NULL,
    [column_3_Id] [datetime] NULL
)

次に、TVP を作成するための C# コードは次のようになります。

DataTable tvp = new DataTable();

// The column order is very important
tvp.Columns.Add(new DataColumn("column_1_Id", typeof (Guid)){AllowDBNull = false};
tvp.Columns.Add("column_2_Id", typeof (Guid));
tvp.Columns.Add("column_3_Id", typeof (DateTime));

foreach (var item in ...)
{
    //just populating
}
于 2015-11-20T15:12:35.407 に答える
2

SQL TVP 列の順序に従ってテーブル値パラメーターが渡されない場合に発生することがありました。

.NET と SQL で同じ順序にする必要があります

[id] [int] NULL,
[appStatus] [varchar](10) NULL,
[lodgedBy] [varchar](10) NULL,

。ネット

objSearch = new AppSearchEN();
objSearch.id= context.Request["AppCat"].ToNullableInteger();
objSearch.appStatus= context.Request["AppStatus"] == "0" ? null : context.Request["AppStatus"];
objSearch.lodgedBy= context.Request["lodgedBy"] == "0" ? null : context.Request["lodgedBy"];

次に、.NET でパラメーターを渡すときに、値が fn のテーブルへのパラメーターの順序が同じである必要があります

于 2015-09-23T13:12:08.630 に答える
1

コードを見ずに何が起こっているのかを正確に知ることは困難ですが、簡単に推測するとSqlParameter.SqlDbType = SqlDbType.Structured、 と? を設定していますSqlParameter.TypeName = "YourTableType"か?

もしそうなら、生成された T-SQL はどのように見えますか (SQL プロファイラーで確認できます)?

テーブルの型はどのように宣言されていますか? --CREATE TYPE YourTableType as TABLE ( ... )

ストアド プロシージャはどのように宣言されていますか? --CREATE PROC ... @arg YourTableType READONLY ... AS ...

DataTable はどのように構成されていますか? 次のようなものが含まれている必要があります。

yourDataTable.Columns.Add("columnName", typeof(datetime2));
于 2011-12-02T14:26:09.767 に答える