我正在弄清楚如何获取地理数据(Lat / Lon)并使用Geography列将其添加到SQL数据库中。我引用Microsoft.SqlServer.Types
来获取SqlGeographyBuilder
我还应该补充一点,这是在SQL2008r2上
我的C#项目也在使用.Net 4.0
这只是我在C#代码中使用的一段代码:
SqlParameter param21 = new SqlParameter();
param21.ParameterName = "@Shape";
param21.UdtTypeName = "Geography";
param21.SqlDbType = System.Data.SqlDbType.Udt;
param21.Size = 1;
SqlGeographyBuilder sqlGeogBuild = new SqlGeographyBuilder();
SqlGeography sqlGeog = null;
sqlGeogBuild.SetSrid(4267);
if (inputReader[parmLatColumnName].ToString().Length > 0 && inputReader[parmLonColumnName].ToString().Length > 0)
{
sqlGeogBuild.BeginGeography(OpenGisGeographyType.Point);
sqlGeogBuild.BeginFigure(float.Parse(inputReader[parmLatColumnName].ToString()), float.Parse(inputReader[parmLonColumnName].ToString()));
sqlGeogBuild.EndFigure();
sqlGeogBuild.EndGeography();
sqlGeog = sqlGeogBuild.ConstructedGeography;
param21.Value = sqlGeog;
}
else
{
param21.Value = DBNull.Value;
}
sqlComm.Parameters.Add(param21);
当我使用分析器时,我发现我的查询看起来像这样:
declare @p21 sys.geography
set @p21=convert(sys.geography,0xE6100000010C00000080B0374040000000806BD057C0)
exec insPoints @stCty=N'31256',@InstrumentType=N'''ogVal''',@FileDate='2008-01-03 00:00:00',@EntryNumber=N'''500''',@Vol=N'NULL',@Page=N'NULL',@Lessor=N'''name''',@Lessee=N'''company name''',@InstrumentDate='2000-01-12 00:00:00',@Term=3,@TermType=N'''Years''',@Expiration='2010-07-12 00:00:00',@Royalty=0.000100000,@GrossAcres=1.000000000,@AgencyId=N'NULL',@Agency=N'''Fee''',@EffDate=NULL,@Survey=N'''A500,A06,A700,A400,A900''',@Longitude=-91.000000000,@Latitude=30.000000000,@Shape=@p21
当我将其作为地理类型传递时,为什么会将其转换为地理类型?
答案 0 :(得分:1)
SQL Server允许定义自己的数据类型。这称为用户定义数据类型(UDT)。
您正在使用用户定义类型来定义@Shape
。由于您没有在数据库中定义单独的用户定义数据类型Georgaphy
,因此它将值转换为系统数据类型geography
。案例并不重要,重要的是
使用SqlPArameter
class - DbType
的不同属性来直接引用db数据类型可以解决这个问题。但是,SqlDbType enumerator中没有geography
成员。
看起来像是.Net和SQL服务器之间的差距。尝试设置DbType = "geography"
,但不太可行。
答案 1 :(得分:0)
首先,请查看此文档页面@MSDN Manipulating UDT Data
因此,从c#开始,您的查询将包含一个UDT数据,该数据首先需要通过SQL转换为该UDT类型(默认行为)。然后它将作为本机类型处理。 同意@Stoleg,当枚举SqlDbType中定义了值时,此转换不会出现在您的探查器上。
但是今天我们已经发布了.NET 4.6,但这并没有在枚举中添加。