【问题标题】:Passing SqlGeometry To Simple.Data Stored Procedure将 SqlGeometry 传递给 Simple.Data 存储过程
【发布时间】:2012-10-13 15:55:14
【问题描述】:

我正在尝试使用 Simple.Data 和 SQL Server 2008 将 SqlGeometry 类型传递给存储过程。存储过程定义如下所示:

CREATE PROCEDURE [dbo].[spUpdateDamLocation]
(
  @DamID int,
  @Shape geometry
)

我用于 Simple.Data 的调用如下所示:

var db = Simple.Data.Database.OpenConnection(dbConn);
db.spUpdateDamLocation(DamID: damLocation.DamID, Shape: damLocation.Shape);

dbConn 是连接字符串,damLocation.DamID 是整数,damLocation.Shape 是 SqlGeometry 对象。

我得到的错误是:

System.ArgumentException: UdtTypeName property must be set for UDT parameters.
at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)
at System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount,     Boolean inSchema, SqlParameterCollection parameters)
at System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at Simple.Data.Ado.DbCommandExtensions.TryExecuteReader(IDbCommand command)
at Simple.Data.Ado.ProcedureExecutor.ExecuteReader(IDbCommand command)
at Simple.Data.Ado.ProcedureExecutor.Execute(IDictionary`2 suppliedParameters, IDbTransaction transaction)
at Simple.Data.Ado.ProcedureExecutor.Execute(IDictionary`2 suppliedParameters)
at Simple.Data.Ado.AdoAdapter.Execute(String functionName, IDictionary`2 parameters)
at Simple.Data.Database.ExecuteFunction(Object& result, ExecuteFunctionCommand command)
at Simple.Data.DataStrategy.TryInvokeFunction(String functionName, Func`1 getFunctionArguments, Object& result)
at Simple.Data.DataStrategy.TryInvokeMember(InvokeMemberBinder binder, Object[] args, Object& result)
at CallSite.Target(Closure , CallSite , Object , Int32 , SqlGeometry )
at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid3[T0,T1,T2](CallSite site, T0 arg0, T1 arg1, T2 arg2)

有没有办法在 Simple.Data 中指定参数的特定 UDT?如果我只是使用 ADO.NET,我会这样做:

SqlParameter sqlParam = sqlCmd.Parameters.Add("@Shape", SqlDbType.UDT);
sqlParam.UdtTypeName = "geometry";
sqlParam.Value = myTypeOfSqlGeometry;

【问题讨论】:

  • 我现在不在计算机附近,但是您需要通过 WKT/WKB 而不是几何将其传递给 proc,然后在 proc 本身中将其重新创建为几何。有点啰嗦,但它会工作。

标签: sql-server-2008 spatial simple.data


【解决方案1】:

Simple.Data 目前不处理用户定义的类型。几个月前,github 上的Issue 163 提出了一个类似的问题,因为遇到 UDT 导致 SqlSchemaProvider 崩溃。该错误已修复,但似乎没有进一步开发支持 SqlGeometry、SqlGeography 等。

您正在尝试的存储过程似乎是最好的方法,但由于未明确支持 UDT,因此通过调用 ToString() 将 SqlGeometry 对象作为其 WKT 文字等价物发送可能会起作用?

var db = Simple.Data.Database.OpenConnection(dbConn);
db.spUpdateDamLocation(DamID: damLocation.DamID, Shape: damLocation.Shape.ToString());

此外,Simple.Data v1 指日可待,我建议 opening a new issue 在 v1.1 中添加 UDT 支持,这样您以后就不需要经历这些麻烦了。

【讨论】:

  • 您描述的解决方案是一个很好的解决方法。我会按照你的建议打开一个问题,因为最终处理 UDT 而不需要任何额外步骤会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2016-04-27
  • 2016-04-05
相关资源
最近更新 更多