C # SQL DataTable: добавление столбца пользовательского типа - PullRequest
0 голосов
/ 11 октября 2018

Я хочу вызвать хранимую процедуру в моей базе данных 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 поддерживать этот пользовательский тип или пользовательские типы в целом?

...