ASP.NET 控制台应用程序 C# 中的“抛出异常:Microsoft.SqlServer.Types.dll 中的‘System.FormatException’”

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)

Tay*_*yab 3

以下是代码中需要更正的一些内容:

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 作为提供的字符串格式。

  • 我尝试在我的机器上模拟所提供的架构和代码的问题,但遇到了相同的异常,我能够摆脱为 SqlGeography 类型参数指定 UdtTypeName 的问题。 (3认同)