2017-08-08 64 views
0

我有一个简单的代码来创建表值类型的SqlParameter。给定的代码适用于.NET 4.0。 问题在于MONO CS(3.12.0),我不能简单地在MONO中编译相同的代码。表值参数问题与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财产,但它的存在在源代码中。

所以,我已经使用Reflection到值设置为TypeName属性:

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