SqlDbType和Geography

时间:2010-09-17 15:24:43

标签: sql sql-server-2008 ado.net

当我的列是Geography类型时,我应该使用什么SqlDbType枚举?我正在使用MS SQL Server 2008 R2。

这正是我正在寻找的:

// ADO.net - what do I use for the SqlDbType when it's defined 
// as Geography in the stored proc
SqlCommand command = new SqlCommand();
command.CommandText = "dbo.up_Foobar_Insert";
command.CommandType = CommandType.StoredProcedure;

command.Parameters.Add("@SomeGeographyType", SqlDbType.????);

3 个答案:

答案 0 :(得分:12)

SqlGeography由SQL Server实现为CLR用户定义类型,因此您可以执行以下操作:

SqlGeography geo = // Get the geography from somewhere...

using (SqlCommand command = 
    new SqlCommand(@"dbo.up_Foobar_Insert", connection))
    command.Parameters.Add(new SqlParameter("@Point", geo) { UdtTypeName = "Geography" });
    command.ExecuteNonQuery();
}

如果它是桌面应用程序,那么你可以轻松搞定它。 SQL Geometry查看器的Code Project有一个很好的例子,可以帮助桌面或Web。

您需要引用在SQL Server Install / 100 / SDK / Assemblies中找到的Microsoft.SqlServer.Types.dll才能直接使用SQLGeometry或SQLGeography。

答案 1 :(得分:0)

<强>更新

试试这个:

//define parameter
command.Parameters.Add("@shape", SqlDbType.NVarChar);
//
//code in between omitted
//
//set value of parameter
command.Parameters["@shape"].Value = feature.Geometry.AsText();

取自Inserting SQL 2008 Geometry With a SqlCommand

答案 2 :(得分:0)

当我尝试使用SqlDbType.NVarChar时收到错误消息

  

无法将参数值从“地理位置”转换为字符串

对我来说解决此问题的方法是使用SqlDbType.Udt

var pgeo = cmd.Parameters.Add("@GeoLocation", SqlDbType.Udt);
pgeo.UdtTypeName = "Geography";

然后,在一个循环中,我设置参数的值:

var ss = new SqlString(objValue.ToString());
var sc = new SqlChars(ss);
var geocode = SqlGeography.STPointFromText(sc, 4326);
cmd.Parameters["@GeoLocation"].Value = geocode;

注意:这需要Microsoft.SqlServer.TypesSystem.Data.SqlTypes