2014-01-15 17 views
2

是否可以使用F#中的类型提供程序访问具有类型为Geography的列的SQL Server 2008表?在F#中,如何使用Type Provider访问Sql Server Geography数据类型?

这是我的联系:

type dbSchemaAnalyticsWeb = SqlDataConnection<"Data Source=sql2008;Initial Catalog=Analytics;User ID=USER;Password=PASSWORD;"> 

然后将代码插入数据:

let dbAnalyticsSQL = dbSchemaAnalyticsWeb.GetDataContext() 

let sqlGeogBuild = new SqlGeographyBuilder() 
      sqlGeogBuild.BeginGeography(OpenGisGeographyType.Point); 
      sqlGeogBuild.BeginFigure(lat, long) 
      sqlGeogBuild.EndFigure() 
      sqlGeogBuild.EndGeography() 

      let LData = new dbSchemaAnalyticsWeb.ServiceTypes.LocationsData(
             Address = address, 
             ZipCode = zipCode,           
             Longitude = long, 
             Latitude = lat, 
             GeoLocation = sqlGeogBuild.ConstructedGeography) 

在上面的代码中,场GeoLocation中引用从SQL Server的地理数据类型。然而,我得到一个错误“成员或对象构造函数'LocationData'没有参数或可设置的返回属性'GeoLocation'。是否有另一种方法来引用这个字段,或其他一些接口,或者是这种数据类型根本不可访问?

注意,我使用的Visual Studio 2012和.NET 4.5。

回答

0

您正在使用LinqToSql提供者,它没有对SqlGeography类型的支持。请尝试使用实体框架提供。

这里是如何我参考了一个在我的项目中使用SqlGeography的数据库:

type internal Database = SqlEntityConnection<ConnectionStringName="DefaultConnection", LocalSchemaFile="Context.ssdl", ConfigFile="Web.config", ForceUpdate=true, Pluralize=true> 

对于大多数用途,LinqToSql和Entity Framework提供程序非常相似。主要区别在于实体框架提供程序将类型公开为内部类型,而LinqToSql将事物公开。

如果由于某种原因,你宁愿留在LinqToSql中,也有一些work-arounds可能允许你做你想做的事。

+0

谢谢。我通过添加插入/更新触发器找到了另一个解决方法。请参阅rheitzman的答案,[链接](http://stackoverflow.com/questions/17684002/simple-update-trigger-simple-row-insert) – MichaelB

相关问题