2017-08-08 3 views
0

Ich habe einen einfachen Code zum Erstellen von SqlParameter für Table Valued Type. Der angegebene Code funktioniert gut mit .NET 4.0. Problem ist mit MONO CS (3.12.0), ich kann nicht einfach den gleichen Code in MONO kompilieren.Table Valued Parameter Problem mit 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; 
} 

Mono Compiler mir diesen Fehler geben:

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)

Der angegebene Code einfach versucht, einen Parameter für TableValued Typ zu erstellen und Datentabelle auf SQL INSERT-Anweisung übergeben.

Ich weiß, dass der Fehler gelöst werden kann, wenn ich gespeicherte Prozedur verwende, aber in meinem Fall ist es nicht machbar, MERGE insert SP für jede einzelne Tabelle zu erstellen.

Also bitte helfen Sie mir, wenn es irgendeine Arbeit um dieses Problem gibt.

Hinweis: Es ist bekannt, dass MONO System.Data.SqlClient.SqlParameter keine TypeName Eigenschaft besitzt. Wenn ich diese Eigenschaft entfernen dann kompiliert es in Ordnung, aber gibt Laufzeitfehler:

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

Antwort

0

MONO SqlParameter Klasse nicht TypeName Eigenschaft verfügbar macht, aber es ist im Quellcode gibt.

So habe ich Reflection verwendet, um eingestellten Wert zu TypeName Eigenschaft:

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); 
Verwandte Themen