3

Geography データ (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

Geography タイプとして渡すと、Geography タイプに変換されるのはなぜですか?

4

2 に答える 2

1

SQL Server では、独自のデータ型を定義できます。これは、ユーザー定義データ型 (UDT) と呼ばれます。

を定義するためにユーザー定義型を使用しています@Shape。データベースに別のユーザー定義データ型が定義されていないため、Georgaphy値がシステム データ型に変換されますgeography。大文字と小文字は重要ではありません。

SqlPArameterクラスの別のプロパティを使用する-DbType代わりにdbデータ型を直接参照すると、これが解決されます。ただし、SqlDbType enumeratorgeographyにはメンバーがありません。

.Net と SQL サーバーの間のギャップのように見えます。を設定DbType = "geography"してみてください。

于 2013-06-20T16:05:24.857 に答える