Sre*_*ree 5 c# sql-server asp.net
我正在尝试将 Sqlgeography 列从纬度、经度点插入到 SQL Server 2016,但我得到
抛出异常:Microsoft.SqlServer.Types.dll 中的“System.FormatException”
我已在计算机上安装了适用于 SQL Server 2016 的 Microsoft System CLR Types。解决这个问题的正确方法是什么。
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();
Run Code Online (Sandbox Code Playgroud)
错误:
“ConsoleApp2.exe”(CLR v4.0.30319:DefaultDomain):已加载“C:\ Windows \ Microsoft.Net \ assembly \ GAC_32 \ mscorlib \ v4.0_4.0.0.0__b77a5c561934e089 \ mscorlib.dll”。无法找到或打开 PDB 文件。
“ConsoleApp2.exe”(CLR v4.0.30319:DefaultDomain):已加载“C:\Users\ssindhu\source\repos\ConsoleApp2\ConsoleApp2\bin\Debug\ConsoleApp2.exe”。符号已加载。'ConsoleApp2.exe'(CLR v4.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”(CLR v4.0.30319:ConsoleApp2.exe):已加载“C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System \ v4.0_4.0.0.0__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__b77a5c561934e089 \ System.Core.dll”。无法找到或打开 PDB 文件。
“ConsoleApp2.exe”(CLR v4.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”(CLR v4.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”(CLR v4.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”(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_MSIL \ Microsoft.SqlServer.Types \ 14.0.0.0__89845dcd8080cc91 \ 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__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
);
Run Code Online (Sandbox Code Playgroud)
以下是代码中需要更正的一些内容:
SqlCommand addpoint = new SqlCommand("INSERT INTO " + Helper.TABLE_ALLINDEXPOINTS + " values (@id, @latitude, @longitude, @streetname, @longlat)", sqlConnection);
Run Code Online (Sandbox Code Playgroud)
请注意值之前的空格。还缺少一个右括号。
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();
Run Code Online (Sandbox Code Playgroud)
另外,请分享异常的详细信息以及表字段的可能数据类型,以防上述方法无法解决您的问题。
编辑
除了上述所有问题之外,您面临的实际问题将通过在调用 ExecuteQuery 之前附加以下行来解决:
addpoint.Parameters[4].UdtTypeName = "Geography";
Run Code Online (Sandbox Code Playgroud)
由于 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();
Run Code Online (Sandbox Code Playgroud)
希望这能解决您的所有问题。
另一个注意事项是使用 Helper.SRID = 4326 作为提供的字符串格式。
| 归档时间: |
|
| 查看次数: |
954 次 |
| 最近记录: |