passer en type de géographie et SQL convertit en type de géographie?

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 SqlPArameterDbType 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.