1

Simple.DataとSQLServer2008を使用して、ストアドプロシージャに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;
4

1 に答える 1

0

Simple.Dataは現在、ユーザー定義型を処理していません。githubのIssue163は、UDTに遭遇するとSqlSchemaProviderがクラッシュしたため、数か月前に同様の質問を提起しました。バグは修正されましたが、SqlGeometry、SqlGeographyなどをサポートするためのさらなる開発が行われていないようです。

ストアドプロシージャは、あなたが試みているように最善の方法のように見えますが、UDTは明示的にサポートされていないため、ToString()の呼び出しと同等のWKTリテラルとしてSqlGeometryオブジェクトを送信することはおそらく機能しますか?

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

また、Simple.Data v1が間もなく登場するので、UDTサポートの新しい問題を開いてv1.1に追加することをお勧めします。そうすれば、将来そのようなフープを経験する必要がなくなります。

于 2012-10-23T20:20:10.497 に答える