Je découvre comment prendre des données de géographie (Lat / Lon) et l'append à une database SQL en utilisant une colonne de géographie. Je reference Microsoft.SqlServer.Types
pour get le SqlGeographyBuilder
Je devrais aussi append que c'est sur SQL2008r2
Mon projet C # utilise également .Net 4.0
Ceci est juste un extrait de code que j'utilise dans mon code C # pour faire ceci:
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].ToSsortingng().Length > 0 && inputReader[parmLonColumnName].ToSsortingng().Length > 0) { sqlGeogBuild.BeginGeography(OpenGisGeographyType.Point); sqlGeogBuild.BeginFigure(float.Parse(inputReader[parmLatColumnName].ToSsortingng()), float.Parse(inputReader[parmLonColumnName].ToSsortingng())); sqlGeogBuild.EndFigure(); sqlGeogBuild.EndGeography(); sqlGeog = sqlGeogBuild.ConstructedGeography; param21.Value = sqlGeog; } else { param21.Value = DBNull.Value; } sqlComm.Parameters.Add(param21);
Lorsque j'ai utilisé le profileur, j'ai trouvé que ma requête ressemblait à ceci:
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
Pourquoi le convertit-il en un type de géographie quand je le passe en tant que type de géographie?
SQL Server permet de définir vos propres types de données. C'est ce qu'on appelle le type de données défini par l'user (UDT).
Vous utilisez un type défini par l'user pour définir @Shape
. Comme vous ne disposez pas d'un type de données défini par l'user séparé Georgaphy
défini dans votre database, il convertit la valeur en geography
type de données système. Le cas n'est pas important, il importe que
Utiliser une propriété différente de la class SqlPArameter
– DbType
place pour referencer directement le type de données db aurait résolu cela. Cependant, il n'y a aucun membre de geography
dans l' énumérateur SqlDbType .
Cela ressemble à un écart entre .Net et SQL Server. Essayez de définir DbType = "geography"
, mais il est peu probable que cela fonctionne.
Tout d'abord, jetez un oeil à cette page de documentation @MSDN Manipulation des données UDT
Donc à partir de c # votre requête contiendra une donnée UDT qui doit d'abord être convertie en ce type UDT par SQL (le comportement par défaut). Ensuite, il sera traité comme un type natif. Un accord avec @Stoleg que cette conversion n'apparaîtra pas sur votre profileur quand il y a une valeur définie dans enum SqlDbType.
Mais aujourd'hui, nous avons publié .NET 4.6 mais ce n'est pas encore ajouté dans cette énumération.