Я пытаюсь использовать новый 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.