Как читать тривиальный пользовательский тип из таблицы SQL Server в .NET? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть определенный пользователем тип данных в SQL Server 10 (2008):

CREATE TYPE [dbo].[sweyi047_corrid] FROM [binary](24) NULL

Когда этот тип выбран из таблицы, я не могу получить данные из .NET, потому что я получаю SqlException на ExecuteReader, утверждая, что тип sweyi047_corrid неизвестен для параметра №.'1'.Тривиальный пример:

var stmt = Connection.CreateCommand();
stmt.CommandText = @"CREATE TABLE #test ( col sweyi047_corrid );
  INSERT INTO #test VALUES(0x1020);
  SELECT col from #test";
var rdr = stmt.ExecuteReader(); // crash!
rdr.Read();
var ret = rdr.GetValue(0);

Если я выберу только скаляр, все будет работать так же, как и ожидалось для того же типа:

stmt.CommandText = @"DECLARE @var sweyi047_corrid;
  SET @var = 0x1020;
  SELECT @var;";

В этом случае я получаю объект типа byte[24] какожидается.

Как правильно читать таблицы, содержащие столбцы UDT?

1 Ответ

0 голосов
/ 16 октября 2018

Вопрос оказывается дубликатом Определяемого пользователем типа данных и таблицы #temp .Это никак не связано с .NET.Сам код SQL недопустим.

Проблема не в том, что временные таблицы не могут ссылаться на UDT текущей базы данных. И нет разумного обходного пути без жесткого кодирования базового типа данных UDT.в сценарий, который превращает UDT ad absurdum.

Единственный практический обходной путь - не использовать временные таблицы и вместо табличных переменных .Однако они не поддерживают полный набор функций временных таблиц.В случае, если вам нужна одна из таких функций, как индексы, вы потерялись.

...