Я хочу вызвать хранимую процедуру в моей базе данных 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 #, но нет ничего, прямо соответствующего типу date
, поддерживаемому MSSQL.Конечно, у нас есть DateTime
в C #, но это более общий вопрос.Так получилось, что у меня есть собственный простой класс 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 date
используется вбазы данных, и я хотел бы сделать код чище, если смогу.Поэтому я спрашиваю, как я могу заставить DataTable
поддерживать этот пользовательский тип или пользовательские типы в целом?