我试图从纬度、经度点插入一个sqlgeography列到sql server 2016,但是我得到了
引发异常:Microsoft.SqlServer.Types.dll中的“System.FormatException”
我已经在计算机上安装了用于SQL Server 2016的Microsoft系统CLR类型。解决这个问题的正确方法是什么?
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'(clr v4.0.30319:defaultdomain):已加载'c:\ windows\microsoft.net\assembly\gac\u 32\mscorlib\v4.0\u 4.0.0.0\uuu b77a5c561934e089\mscorlib.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:defaultdomain):已加载'C:\用户\ssindhu\source\repos\consoleapp2\consoleapp2\bin\debug\consoleapp2.exe'。符号已加载。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):加载了'c:\ windows\microsoft.net\assembly\gac\u msil\system.net.http\v4.0\u 4.0.0.0\uuu b03f5f7f11d50a3A\system.net.http.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):已加载'C:\Windows\Microsoft.NET\Assembly\GAC\u msil\system\v4.0\u 4.0.0.0\uu b77a5c561934e089\system.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):加载了'c:\ windows\microsoft.net\assembly\gac_msil\system.core\v4.0_4.0.0.0_u b77a5c561934e089\system.core.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):已加载'C:\Windows\Microsoft.NET\Assembly\GAC\u msil\system.configuration\v4.0\u 4.0.0.0\uuu b03f5f7f11d50a3A\system.configuration.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):加载了'c:\ windows\microsoft.net\assembly\gac_msil\system.xml\v4.0_4.0.0.0_u b77a5c561934e089\system.xml.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):已加载'c:\ windows\microsoft.net\assembly\gac_32\system.data\v4.0_4.0.0.0_77a5c561934e089\system.data.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):加载了'c:\ users\ssindhu\source\repos\consoleapp2\consoleapp2\bin\debug\newtonsoft.json.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):已加载'c:\ windows\assembly\gac\u msil\microsoft.sqlserver.types\14.0.0.0\uuuu89845dcd8080cc91\microsoft.sqlserver.types.dll'。找不到或无法打开PDB文件。
'consoleapp2.exe'(clr v4.0.30319:consoleapp2.exe):加载了'c:\ windows\microsoft.net\assembly\gac_32\system.transactions\v4.0_4.0.0.0_77a5c561934e089\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
);
最佳答案
以下是需要在代码中更正的一些内容:
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";
因为sql server要求您显式地为sqlgeography类型的参数设置udttypename(以及其他一些类型,我在这里没有提到)。
因此,更新后的代码应该类似于:
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作为提供的字符串格式。