首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SqlGeometry传递给Simple.Data存储过程

将SqlGeometry传递给Simple.Data存储过程
EN

Stack Overflow用户
提问于 2012-10-23 16:32:20
回答 1查看 1.3K关注 0票数 1

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

代码语言:javascript
复制
CREATE PROCEDURE [dbo].[spUpdateDamLocation]
(
  @DamID int,
  @Shape geometry
)

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

代码语言:javascript
复制
var db = Simple.Data.Database.OpenConnection(dbConn);
db.spUpdateDamLocation(DamID: damLocation.DamID, Shape: damLocation.Shape);

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

我得到的错误是:

代码语言:javascript
复制
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,我就会这样做:

代码语言:javascript
复制
SqlParameter sqlParam = sqlCmd.Parameters.Add("@Shape", SqlDbType.UDT);
sqlParam.UdtTypeName = "geometry";
sqlParam.Value = myTypeOfSqlGeometry;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-23 20:20:10

Simple.Data目前还没有处理用户定义的类型。几个月前,第163期在github上提出了一个类似的问题,那就是遇到了UDT坠毁的SqlSchemaProvider。该bug已经修复,但似乎还没有进一步开发到支持SqlGeometry、SqlGeography等。

正如您正在尝试的那样,存储过程似乎是最好的方法,但是由于不显式地支持UDT,也许将SqlGeometry对象作为其WKT文本等效的调用ToString()可以工作吗?

代码语言:javascript
复制
var db = Simple.Data.Database.OpenConnection(dbConn);
db.spUpdateDamLocation(DamID: damLocation.DamID, Shape: damLocation.Shape.ToString());

另外,在Simple.Data v1即将到来的时候,我建议在v1.1中添加UDT支持的开创新的一期,这样以后就不需要经历这样的循环了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13035158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档