表值参数问题与MONO cs

时间:2017-08-08 12:58:27

标签: c# sql .net mono sql-merge

我有一个简单的代码来为表值类型创建SqlParameter。给定的代码适用于.NET 4.0。 问题出在MONO CS(3.12.0)上,我不能简单地在MONO中编译相同的代码。

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编译器给我这个错误:

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 Type创建一个参数,并将数据表传递给SQL insert语句。

我知道如果我使用存储过程可以解决错误,但在我的情况下,无法为每个表创建MERGE插入SP。

如果对此问题有任何解决方法,请帮助我。

注意:众所周知,MONO System.Data.SqlClient.SqlParameter没有TypeName属性。如果我删除了这个属性,那么它编译得很好,但会给出运行时错误:

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

1 个答案:

答案 0 :(得分: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);