12

SQL Serverに緯度と経度を格納するのに最適なタイプは10進数(9,6)であることがわかりました(SQLデータベースに緯度と経度のデータを格納するときに使用するデータ型を参照してください) 。

AddColumn("dbo.Table", "Latitude", c => c.Decimal(nullable: false, precision: 9, scale: 6));
AddColumn("dbo.Table", "Longitude", c => c.Decimal(nullable: false, precision: 9, scale: 6));

SQLは問題ないようですが、すべてが機能していますが、値を挿入/更新すると、

lat = 44.5912853

次のように保存されます。

44.590000

フローを確認しましたが、更新の直前に、エンティティに正しい値が含まれているため、コードに関連しているとは思いませんが、EF/SQLに関連していると思います。これを避けるためのアイデアはありますか?

アップデート

update [dbo].[Breweries]
set [RankId] = @0, 
[Name] = @1, 
[Foundation] = null, 
[DirectSale] = @2, 
[OnlineSale] = @3, 
[StreetAddress] = @4, 
[StreetAddress1] = null, 
[ZIP] = @5, 
[City] = @6, 
[Province] = @7, 
[CountryCode] = @8, 
[Latitude] = @9, 
[Longitude] = @10, 
[PIVA] = null, 
[CodFiscale] = null
where ([BreweryId] = @11)

ここに画像の説明を入力してください

POCOエンティティ

[Table("Breweries")]
public class Brewery : ABrewery 
{
  ....
  public decimal Latitude { get; set; }
  public decimal Longitude { get; set; }
}

SQLプロファイラー

exec sp_executesql N'update [dbo].[Breweries]
set [RankId] = @0, [Name] = @1, [Foundation] = null, [DirectSale] = @2, [OnlineSale] = @3, [StreetAddress] = @4, [StreetAddress1] = null, [ZIP] = @5, [City] = @6, [Province] = @7, [CountryCode] = @8, [Latitude] = @9, [Longitude] = @10, [PIVA] = null, [CodFiscale] = null
where ([BreweryId] = @11)
',N'@0 int,@1 nvarchar(128),@2 bit,@3 bit,@4 nvarchar(256),@5 varchar(16),@6 nvarchar(64),@7 nvarchar(64),@8 nvarchar(128),@9 decimal(18,2),@10 decimal(18,2),@11 int',@0=2,@1=N'Davide',@2=0,@3=0,@4=N'Via Moscardini, 24',@5='zip',@6=N'city',@7=N'province',@8=N'ITA',

@9=44.59,@10=11.05,@11=2

ありがとう

4

4 に答える 4

8

どうやらこの男はまったく同じ問題を抱えていて、こうしてそれを解決しました:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Activity>().Property(a => a.Latitude).HasPrecision(18, 9);
    modelBuilder.Entity<Activity>().Property(a => a.Longitude).HasPrecision(18, 9);
}

ただし、SQL Server 2008以降での空間データ型(特に)の使用を検討することをお勧めします。geography

于 2013-02-23T11:39:04.627 に答える
4

DbGeographyタイプを使用して、緯度と経度を保存できます。

using System.Data.Entity.Spatial;

public class Test
{
    public DbGeography Location { get; set; }
}
于 2016-09-03T22:20:16.443 に答える
1

2つのこと:

  1. 郵便番号データベースを購入したところ、すべての緯度と経度の値がdecimal(12,6)データ型として保存されています。しかし、これによって結果が根本的に変わることはないと思います。

  2. SQLServerに送信されている正確なSQLを確認します。次に、丸めが発生している場所を確認できます。EFからの出力を取得するか、SQLプロファイラーを使用して、送信されているSQLを確認できます。私の推測では、それはあなたのC#コードで発生していると思います。

また、テーブルスキーマとドメインエンティティを確認すると便利な場合があります。

于 2013-02-23T11:22:58.800 に答える
0

これらのフィールドのデータ型をFloatとして使用します。

 Latitude float,
 Longitude float
于 2013-02-23T11:32:32.353 に答える