我试图插入从纬度、经度点到SQL server 2016的SQL地理列,但我得到了
引发的异常:“System.FormatException”在Microsoft.SqlServer.Types.dll中
我已经在机器上安装了用于Server 2016的类型。解决这个问题的正确方法是什么?
SqlCommand addpoint = new SqlCommand("INSERT INTO " + Helper.TABLE_ALLINDEXPOINTS + "values (@id, @latitude, @longitude, @streetname, @longlat", sqlConnection);
addpoint.Parameters.AddWithValue("@id", id);
addpoint.Parameters.AddWithValue("@latitude",Convert.ToDouble(snappedPoints[j]["latitude"]));
addpoint.Parameters.AddWithValue("@longitude",Convert.ToDouble(snappedPoints[j]["longitude"]));
addpoint.Parameters.AddWithValue("@streetname", snappedPoints[j]["name"].ToString());
addpoint.Parameters.AddWithValue("@longlat", SqlGeography.STGeomFromText(new SqlChars(string.Format("POINT({0} {1})", snappedPoints[j]["latitude"], snappedPoints[j]["longitude"])), Helper.SRID));
addpoint.ExecuteNonQuery();错误:
“ConsoleApp2.exe”(CLRv4.0.30319: DefaultDomain):已加载的'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: DefaultDomain):已加载的'C:\Users\ssindhu\source\repos\ConsoleApp2\ConsoleApp2\bin\Debug\ConsoleApp2.exe'.符号已加载。“ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Users\ssindhu\source\repos\ConsoleApp2\ConsoleApp2\bin\Debug\Newtonsoft.Json.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\14.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll'.无法找到或打开PDB文件。 “ConsoleApp2.exe”(CLRv4.0.30319: ConsoleApp2.exe):加载'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll'.无法找到或打开PDB文件。
这是表模式:
create table all_index_points
(
id varchar(450) not null primary key,
latitude float,
longitude float,
streetname nvarchar(max),
longlat geography
);发布于 2019-04-30 06:27:23
下面是您的代码中需要更正的一些内容:
SqlCommand addpoint = new SqlCommand("INSERT INTO " + Helper.TABLE_ALLINDEXPOINTS + " values (@id, @latitude, @longitude, @streetname, @longlat)", sqlConnection);注意值之前的空格。也缺少了一个关闭支架。
addpoint.Parameters.AddWithValue("@id", id);
addpoint.Parameters.AddWithValue("@latitude",Convert.ToDouble(snappedPoints[j]["latitude"]));
addpoint.Parameters.AddWithValue("@longitude",Convert.ToDouble(snappedPoints[j]["longitude"]));
addpoint.Parameters.AddWithValue("@streetname", snappedPoints[j]["name"].ToString());
addpoint.Parameters.AddWithValue("@longlat", SqlGeography.STGeomFromText(new SqlChars(string.Format("POINT({0} {1})", snappedPoints[j]["latitude"], snappedPoints[j]["longitude"])), Helper.SRID));
addpoint.ExecuteNonQuery();此外,请共享异常的详细信息以及表字段的可能数据类型,以防上述情况无法解决您的问题。
编辑
除上述所有问题外,您所面临的实际问题将通过在调用ExecuteQuery之前附加以下行来解决:
addpoint.Parameters[4].UdtTypeName = "Geography";因为Server要求您显式地为SqlGeography类型的参数设置SqlGeography(以及其他一些类型,这里我没有提到)。
因此,更新后的代码应该如下所示:
addpoint.Parameters.AddWithValue("@id", id);
addpoint.Parameters.AddWithValue("@latitude",Convert.ToDouble(snappedPoints[j]["latitude"]));
addpoint.Parameters.AddWithValue("@longitude",Convert.ToDouble(snappedPoints[j]["longitude"]));
addpoint.Parameters.AddWithValue("@streetname", snappedPoints[j]["name"].ToString());
addpoint.Parameters.AddWithValue("@longlat", SqlGeography.STGeomFromText(new SqlChars(string.Format("POINT({0} {1})", snappedPoints[j]["latitude"], snappedPoints[j]["longitude"])), Helper.SRID));
addpoint.Parameters[4].UdtTypeName = "Geography";
addpoint.ExecuteNonQuery();希望这能解决你所有的问题。
另一个附加的注意事项是使用Helper.SRID = 4326作为提供的字符串格式。
https://stackoverflow.com/questions/55914952
复制相似问题