Я хочу передать параметр типа SQL Server geography в хранимую процедуру из .Net Core.
Пока что я установил пакеты System.Data.SqlClient и Microsoft.Spatial. Вот мой код:
using (SqlCommand cmd = new SqlCommand("myproc", connection))
{
cmd.CommandType = CommandType.StoredProcedure;
// Here, GeographyPoint is of type Microsoft.Spatial.GeographyPoint, and
// I am pretty sure this is the wrong type to use...
GeographyPoint gp = GeographyPoint.Create(lat, lon);
cmd.Parameters.AddWithValue("@Location", gp);
connection.Open();
cmd.ExecuteNonQuery();
}
Когда я пытаюсь выполнить это, я получаю следующее исключение:
System.ArgumentException: 'No mapping exists from object type Microsoft.Spatial.GeographyPointImplementation to a known managed provider native type
Затем я попытался установить пакет Microsoft.SqlServer.Types, но он несовместим с .Net Core 1.1:
Package Microsoft.SqlServer.Types 14.0.314.76 is not compatible with netcoreapp1.1 (.NETCoreApp,Version=v1.1). Package Microsoft.SqlServer.Types 14.0.314.76 supports: net40 (.NETFramework,Version=v4.0)
Затем я попытался указать, что параметр географии - Udt:
cmd.Parameters["@Location"].SqlDbType = SqlDbType.Udt;
//cmd.Parameters["@Location"].UdtTypeName = "Geography";
ТЕМ НЕ МЕНИЕ: Я не могу установить UdtTypeName на Geography из-за Эта проблема, поэтому это не сработает, потому что UdtTypeName требуется для параметров Udt.
Затем я обновился до .Net Core 2.0. Я снова попытался добавить пакет Microsoft.SqlServer.Types: на этот раз он установился «успешно», но когда я создаю свой проект, я получаю эту ошибку:
warning NU1701: Package 'Microsoft.SqlServer.Types 14.0.314.76' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.0'. This package may not be fully compatible with your project.
Я не могу получить доступ ни к одному из типов в моем коде, поэтому это не сработало.
И остается вопрос: как передать параметр типа SQL Server geography в хранимую процедуру из .Net Core?
Я пробовал несколько вариантов форматированной строки, но безуспешно: System.Data.SqlClient.SqlException (0x80131904): ошибка преобразования типа данных nvarchar в географию.
в качестве обходного пути, возможно, вы можете попробовать изменить SP, чтобы принимать 2 поплавка и объединить это с географической точкой в SP
Да, я могу это сделать, но сначала я надеюсь на правильное решение в .Net Core. Я планирую передавать для этого параметра различные типы геометрии (не только точки), и я не хочу создавать сохраненную процедуру для каждого из них.
Боковое примечание: вы должны нет использовать префикс sp_ для ваших хранимых процедур. У Microsoft есть зарезервировал этот префикс для собственного использования (см. Именование хранимых процедур), и вы действительно рискуете столкнуться с конфликтом имен когда-нибудь в будущем. Это также плохо для производительности вашей хранимой процедуры. Лучше просто избегать sp_ и использовать что-то еще в качестве префикса - или вообще не использовать префикс!
Хороший момент - спасибо!





Отказ от ответственности: я сделал это 5+ лет назад ... но можете ли вы передать строку в форме
"(lat,lng)"в качестве параметра и посмотреть, работает ли это?