2017-08-08 14 views
0

テーブル値型のSqlParameterを作成する簡単なコードがあります。与えられたコードは.NET 4.0でうまく動作します。 問題はMONO CS(3.12.0)であり、MONOで同じコードを単純にコンパイルすることはできません。私は、このエラーを与えてテーブルvalued MONO csのパラメータ問題

static SqlParameter GetDataTableParam(string _tableName, DataTable _dt) 
{ 
    SqlParameter tValue = new SqlParameter(); 
    tValue.ParameterName = "@dr" + _tableName; //@drFactory 
    tValue.SqlDbType = SqlDbType.Structured; 
    tValue.Value = _dt; 

    tValue.TypeName = string.Format("dbo.{0}Item", _tableName); //MONO CS is giving error at this line 
    return tValue; 
} 

モノコンパイラ:

Error CS1061: Type `System.Data.SqlClient.SqlParameter' does not contain a definition for `TypeName' and no extension method `TypeName' of type `System.Data.SqlClient.SqlParameter' could be found. Are you missing an assembly reference? (CS1061)

与えられたコードは、単にTableValuedタイプのパラメータを作成し、SQL INSERT文にデータテーブルを渡そうとしています。

ストアドプロシージャを使用するとエラーが解決することがわかりますが、私のケースでは、各テーブルごとにMERGE挿入SPを作成することはできません。

この問題の回避策がある場合は、私を助けてください。

注:MONO System.Data.SqlClient.SqlParameterは、TypeNameプロパティを持たないことが知られています。私は、このプロパティを削除した場合、それは罰金コンパイルするが、実行時エラーを与える:

The table type parameter '@drFactory' must have a valid type name.

答えて

0

MONO SqlParameterクラスはTypeNameプロパティを公開しませんが、それはソースコード内にあります。

だから、私はTypeNameプロパティに値を設定するためにReflectionを使用しています

SqlParameter tValue = new SqlParameter("@dr" + _tableName, _dt); 
tValue.SqlDbType = SqlDbType.Structured; 

System.Reflection.PropertyInfo propertyInfo = tValue.GetType().GetProperty("TypeName"); 
propertyInfo.SetValue(tValue, "dbo.factoryItem", null);