DataReader.GetFieldType возвращен null

В моей таблице таблиц db есть один столбец, тип которого hierarchyid (column index = 4). При попытке настроить новую среду (виртуальный веб-сервер, созданный с сервера XEN), а затем запустить сайт, я столкнулся с этой проблемой:

Сообщение об исключении: DataReader.GetFieldType(4) возвращает null. Исключительные данные: System.Collections.ListDictionaryInternal

Я сделал поиск и узнал, что на нем уже есть какая-то тема (например, MSDN).

Но даже когда я добавил библиотеку C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll, похоже, что тип db в структуре SqlHierarchyId не распознается.

"Исключение в DataReader.GetFieldType(4) возвращено null" все еще выбрасывается.

Примечание. Проблема будет решена, если я установлю пакет С# в VS2010 на среду (Windows Server 2008 RC2), но мой босс не согласился с этим, потому что это просто простой веб-сервер.

Ответ 1

Ссылка на dll Microsoft.SQLServer.Types из проекта и для ссылки задайте его как "Копировать локальную" в свойствах ссылки. Это позволит упаковать эту DLL с веб-сайтом при его развертывании. Тогда вам не нужен весь SQL Server, установленный в вашем веб-поле, чтобы использовать типы данных SQL Server. Я сделал это для своего сайта, потому что использовал столбцы типа данных geography, и я получал ту же ошибку.

Ответ 2

Решение, которое работает для меня, добавляет к строке подключения " Type System Version = SQL Server 2012".

Пример: string connectionString = "Data Source = myserver; Initial Catalog = mydatabase; User ID = sa; Password = *******; Тип System Version = SQL Server 2012;";

Ответ 3

Я попытался решить эту проблему, добавив пакет NuGet Microsoft.SqlServer.Types в мой проект, но это само по себе не помогло. Мне также пришлось добавить следующее в элемент <assemblyBinding> моего проекта App.config:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  .
  .
  .
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
    </dependentAssembly>
  .
  .
  .
  </assemblyBinding>
</runtime>

Ответ 4

Вместо изменения вашего проекта и добавления ссылки на Microsoft.SQLServer.Types dll вы можете просто поместить его в GAC.

В моем случае у меня было три версии на моей машине dev и добавили их на сервер GAC:

 gacutil.exe -i .\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll
 gacutil.exe -i .\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll
 gacutil.exe -i .\12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll

У меня были другие сторонние инструменты SQL, связанные с SQL, на сервере, которые имели ту же ошибку. После добавления сборок в GAC все они работали нормально.

Пока я не ставил свои собственные сборки в GAC, я думаю, что там можно собрать некоторые сборки Microsoft SQL Server, потому что они влияют на несколько приложений.

Ответ 5

После другого решения, если у вас все еще есть ошибка, попробуйте удалить в web.config

<add assembly="Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>

скопировать файл Microsoft.SqlServer.Types.dll в папку bin (или/и добавить ссылку)

или/и добавить "Тип System Version = SQL Server 2012;" в sqlconnectionstring

Ответ 6

Для тех, кто испытывает эту проблему с PowerShell, я смог решить эту проблему, установив пакет SQLSysClrTypes.msi из Microsoft для SQL Server 2016 и перезапустив PowerShell. Страница загрузки сбивает с толку навигацию, нажмите "Загрузить" и найдите на странице SQLSysClrTypes. Выберите правильную архитектуру.

Exception calling "Fill" with "1" argument(s): "DataReader.GetFieldType(24) 
returned null."
At MyScript.ps1:15 char:5
+     $adapter.Fill($ds) | Out-Null
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], 
ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidOperationException

В моем случае нарушающим типом данных был Microsoft.SqlServer.Types.SqlGeography in position (24) Это поле работало нормально в AppVeyor с установленным SQL Server 2016, но не работало в моей локальной среде.

Я нашел несколько статей, объясняющих, почему это происходит, и в некоторых из них было указано, что NuGet использует для извлечения последнюю версию Microsoft.SqlServer.Types.dll, но в моем случае это не помогло, равно как и попытка замены assembly\GAC_... версия с одним из Install-Package и друзей.

Примечание. Установка .msi не была такой простой, как можно было бы ожидать, потому что методом проб и ошибок я установил несколько более старых "типов CLR системы Microsoft SQL Server". Это привело к тому, что MSI предлагает только "Восстановить" и "Удалить". В этом случае выберите "Удалить" и снова запустите программу установки.

Установка правильной версии и перезапуск PowerShell сделали свое дело.

Ответ 7

Спасибо, после того как я добавил в проект ссылку на Microsoft.SqlServer.Types.dll, проблема была успешно решена.