. Net Core - SQL Исключение типа данных Server Geography - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь использовать новый Microsoft.Data.SqlClient в моем. Net основном приложении. Всякий раз, когда я выбираю столбец с типом данных Geography, я получаю следующую ошибку. Невозможно привести объект типа Microsoft.SqlServer.Types.SqlGeography к типу Microsoft.Data.SqlClient.Server.IBinarySerialize. '

Для воспроизведения я создал базу данных на мой компьютер (SQL2019) с одной таблицей:

DROP TABLE IF EXISTS geotest
GO

CREATE TABLE geotest (g GEOGRAPHY)
GO

INSERT INTO geotest (g)
VALUES
( 0xe6100000010cec51b81e854b4040ec51b81e852b58c0 ), 
( 0xe6100000010c6666666666a64740713d0ad7a3905ec0 )

Я создаю проект консольного приложения (Visual Studio 2019, Net Core 3.1) и добавляю пакет NUGET: Microsoft.Data.SqlClient

Вот мой пример приложения:

using System;
using Microsoft.Data.SqlClient;


namespace TestWithOtherSQL
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=joe;Trusted_Connection=True;");
            conn.Open();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = System.Data.CommandType.Text;
            cmd.CommandText = @"SELECT g FROM geotest";

            SqlDataReader sr = cmd.ExecuteReader();
            while (sr.Read())
            {
                var a = sr[0];
            }

            conn.Close();
            Console.WriteLine("Hello World!");
        }
    }
}

Он выдает ошибку в этой строке:

               var a = sr[0];

Невозможно привести объект типа 'Microsoft.SqlServer.Types.SqlGeography' для ввода 'Microsoft.Data.SqlClient.Server.IBinarySerialize'.

Устранение неполадок:

Если я заменю пакет Nuget на System .Data.SqlClient и включите пакет Microsoft.SqlServer.Types (измените using на System.Data.SqlClient). Работает тот же код.

Так почему бы мне просто не сделать это? Хороший вопрос ... Моя фактическая база данных находится в Azure SQL DB, и мне нужно использовать Microsoft.Data.SqlClient для поддержки аутентификации пароля ActiveDirectory (которая не работает с System.Data.SqlClient), но это другая проблема ....

Кроме того, Microsoft.Data.SqlClient - это "новый" способ работы с ".NetCore". Сейчас для меня это не большая проблема, но я не уверен, сработает ли это, если мы портируем на Linux и попытаемся запустить его в функции Azure.

...