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, проблема была успешно решена.