私は現在、Entity Framework 6とおそらくADO.NETのバグを経験していると思います。期限があるので、このバグが修正されるのを待つことができるかどうかわかりません。うまくいけば、誰かが私にクリーンな作業を手伝ってくれると思います。
問題は、クエリで値1と5が0.01と0.05になるはずの場所で使用されることです。しかし、奇妙なことに0.1は機能しているようです
生成されたクエリは現在次のとおりです(SQL Server Profilerから取得)
declare @p3 dbo.someUDT
insert into @p3 values(NULL,5)
insert into @p3 values(5,0.10)
insert into @p3 values(NULL,1)
insert into @p3 values(1,2)
exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
正しいコードは次のとおりです。
declare @p3 dbo.someUDT
insert into @p3 values(NULL,0.05)
insert into @p3 values(0.05,0.10)
insert into @p3 values(NULL,0.01)
insert into @p3 values(0.01,0.02)
exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
私はすでにgithubで問題を作成しました:ユーザー定義テーブルが間違った値を挿入
パラメーター化されたクエリでユーザー定義のテーブルを使用したいのですが、この質問では、これがどのように行われるかを説明します: エンティティフレームワークストアドプロシージャテーブルの値パラメーター
これは、上記のSQLコードを取得するために使用されるC#コードです
DataTable dataTable = new DataTable();
dataTable.Columns.Add("value1", typeof(decimal));
dataTable.Columns.Add("value2", typeof(decimal));
dataTable.Rows.Add(null,0.05m);
dataTable.Rows.Add(0.05m,0.1m);
dataTable.Rows.Add(null,0.01m);
dataTable.Rows.Add(0.01m,0.02m);
List<SqlParameter> Parameters = new List<SqlParameter>();
Parameters.Add(new SqlParameter("@AName", SqlDbType.Structured) { Value = dataTable , TypeName= "dbo.someUDT" });
dbContext.Database.ExecuteSqlCommand("Select * from @AName", Parameters.ToArray());
そして、ユーザー定義テーブルを取得するSQLコード
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
編集:
ガートアーノルドはそれを理解しました。彼の回答に基づいて、既存のレポートをここで見つけましたSQL ServerプロファイラのTextData列が10進入力を誤って処理します
Select * from @AName
が、プレースホルダーです。私は実際には、質問に関連するとは思わなかったより大きなクエリでテーブルに参加しています。これは、問題をより簡単な形式で既に再現しているためです。
Database.SqlQuery
(ではなくDatabase.ExecuteSqlCommand
)を使用すると、クライアントで正しい値を受け取ります。
dataTable.Rows.Add(null,0.05m);
、それが生成するクエリを確認してください