我想使用表值参数在SQL数据库(MSSQL 2008 R2)上调用存储过程。我可以像这样
var table = new DataTable();
table.Columns.Add(new DataColumn("Col1", typeof(int)));
table.Columns.Add(new DataColumn("Col2", typeof(string)));
table.Rows.Add(55, "hello");
table.Rows.Add(66, "goodbye");
然后稍后我构造一个SqlParameter
对象,其类型为SqlDbType.Structured
,其值为table
。一切正常。
DataTable
支持的列类型集似乎是固定的。大多数SQL原语类型具有等效的C#,但是没有任何直接对应于MSSQL支持的date
类型。当然,我们在C#中有DateTime
,但这是更笼统的。碰巧的是,我有自己的简单类MyDate
来表示日期。它支持一种转换方法ToDateTime()
。
我想教DataTable
有关这种新类型的信息,以便我能够做到
table.Columns.Add(new DataColumn("DateColumn", typeof(MyDate)));
table.Rows.Add(new MyDate(2018, 10, 11));
当前,如果我尝试这样做,我将得到
System.ArgumentException:
The type of column 'DateColumn' is not supported.
The type is 'MyDate'
MyDate
是否应实现某些接口,以便DataTable
支持它?理想情况下,我想指定一个到DateTime
的转换,显然已经由DataTable
处理了。我真的不想一直在整个SQL堆栈中添加对自定义类型的支持,直到在网络上对其进行编码(SqlUserDefinedAggregate
似乎就是这样)。
我尝试实现IConvertible
和ISerializable
;这并不是说。我希望System.Data.SqlTypes
命名空间包含一个我可以使用的SqlDate
类型,而不是我的自定义类型,但是我没有。
很明显,我可以只使用DateTime
并在添加值时进行转换。到目前为止,这就是我所做的。但是我的很多代码库中都使用了MyDate
类型(惯例是将其用于日期,而在需要日期和时间的同时使用DateTime
),SQL {{1} }类型用于数据库中,如果可以的话,我想使代码更整洁。因此,我问,如何使date
支持此自定义类型,或一般而言,自定义类型?