SQL Servr 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

 Microsoft .NET应用通常都是宿主在操作系统平台的.NET Framework之上,如果想在SQL Server 2008中使用.NET进行托管代码,SQL Server 2008将运行一个属于自己的.NET Framewrok平台运行环境(SQLOS),SQLOS和.NET CLR将共享数据库引擎进程空间,因此基于SQL Server 2008的CLR也被称为的SQLCLR基于SQL Server 2008的核心组件SQLCRL提供了友好的的可编程性支持,SQL Server数据库引擎将使用由CLR提供的功能无缝地提供了多种功能其中包括使用空间数据类型goegraphygoemetry的数据的可编程性支持。

 

一、SQLCLR & .NET CLR互编程性

   可以在SQL Server 2008的安装目录下找到SQLCLR与.NET CLR共享的空间数据类型共享库组件(Microsoft.SqlServer.Types.dll),该组件除了支持基于SQL Server 2008的空间数据类型数据库编程,同时也支持基于.NET Framework的面向对象编程,包括对VB.NET、C#的多语言的支持,该组件位于如下安装目录中:    关于空间对象的属性、函数的具体使用这里就不做介绍了,详细请查阅:几何实例上的OGC方法

C:\Program Files\Microsoft SQL Server\ 100 \SDK\Assemblies\Microsoft.SqlServer.Types.dll

 

  通过下面这个示例程序可以演示基于Microsoft.SqlServer.Types.dll在SQLCLR和.NET CLR之间的双向互支持性。

SQLCLR:定义一个地理坐标点
declare @geom geometry;
  
set  @geom  =  geometry::Point( 107.04352 , 28.870554 , 4326 );
  select @geom;
-----------------------------------------------------------------------------------
.NET CLR:定义一个地理坐标点
static   void  Main( string [] args)
{
    var point 
=  SqlGeometry.Point( 107.04352 28.870554 4326 );

    Console.WriteLine(point.STX);
    Console.WriteLine(point.STY);
    Console.WriteLine(point.ToString());
}

 

  在.NET CLR中可以使用所有SQLCLR编程中所提供的编程接口,也就是说在.NET CLR中变成不仅仅只是局限于再空间对象的定义上,还包括对象的相关属性、方法的支持,如下代码块演示了SQLCLR和.NET CLR编程实现地理测距函数的对比。

declare @geom geometry;
set  @geom  =  geometry::Point( 107.04352 , 28.870554 , 4326 );

declare @end geometry;
set  @end  =  geometry::Point( 103.84041 29.170240 , 4326 );
select @geom.STDistance(@end);
------------------------------------------------------------------------
var pointStart 
=  SqlGeometry.Point( 107.04352 28.870554 4326 );
var pointEnd 
=  SqlGeometry.Point( 103.84041 29.170240 4326 );
var result 
=  pointStart.STDistance(pointEnd);
Console.WriteLine(
" 地理距离: "   +  result  +   " (米) " );

 

 

 

二、创建空间对象到数据库

  Microsoft.SqlServer.Types.dll提供友好的.NET CLR编程性,同样我们可以将在.NET CLR中创建的对象插入到空间数据库中进行查询,以便于做空间分析、计算。下面演示通过.NET CLR构造一个多边形空间对象并插入到SQL Server 2008数据库中。

static   void  Main( string [] args)
{
    
// 定义一个多边形
    var polygon  =  SqlGeography.STGeomFromText(
        
new  SqlChars(
        
new  SqlString( " POLYGON ((-114.01611328125 42.0003251483162, -114.0380859375 42.0003251483162, "
            
+   " -113.994140625 37.0200982013681, -109.05029296875 37.0200982013681, -109.09423828125 41.0130657870063,  "
            
+   " -111.07177734375 41.0462168145206, -111.07177734375 42.0003251483162, -114.01611328125 42.0003251483162)) " ,
            
111 )),
            
4326 );

    var sql 
=   " insert Cities (CityName,CityLocation) values ('test',' "   +  polygon.ToString()  +   " ') " ;

    InsertToDB(sql);
}

private   static   void  InsertToDB( string  sql)
{
    
using  (var conn  =   new  SqlConnection(ConfigurationManager.AppSettings[ " SQL2008 " ]))
    {
        
if  (conn.State  ==  ConnectionState.Closed) conn.Open();
        
using  (var cmd  =   new  SqlCommand(sql, conn))
        {
            
int  row  =  cmd.ExecuteNonQuery();
        }
    }
}

 

三、查询数据库空间数据

  首先来看看基于SQL Server Management Studio 查询刚刚入库的记录,通过空间结果可以直接预览查询结果。

declare   @city  geometry;
select   @city   =  CityLocation  from  Cities  where  ID = 5 ;
select   @city ;
select   @city .STArea() as 面积; -- 求面积
 
---------------------------------------------------------------------------------------------------------------------------------------
0x000000000104080000000000000008815CC035B18AA70A0045400000000070825CC035B18AA70A00454000000000A07F5CC0CECAEE93928242400000000038435BC0CECAEE93928242400000000008465BC0BCF1C323AC8144400000000098C45BC01572BD6EEA8544400000000098C45BC035B18AA70A0045400000000008

(1 行受影响)

面积
----------------------
22.6802255629445

(1 行受影响)

        

  同样可以使用.NET CLR对其进行编程实现,这其实和查询普通数据是没有区别的,只是将查询结果转为为的是空间数据类型。可以通过如下代码实现查询空间数据到应用程序中。

static   void  Main( string [] args)
{
    var sql 
=   " select CityLocation from Cities where ID = 5 " ;
    var result 
=  QueryDB(sql);

    var polygon 
=  SqlGeography.STGeomFromText(
        
new  SqlChars(
        
new  SqlString(result)),  4326 );

    Console.WriteLine(polygon.ToString()); 
}

private   static   string  QueryDB( string  sql)
{
    
using  (var conn  =   new  SqlConnection(ConfigurationManager.AppSettings[ " SQL2008 " ]))
    {
        
if  (conn.State  ==  ConnectionState.Closed) conn.Open();
        
using  (var cmd  =   new  SqlCommand(sql, conn))
        {
            
return  cmd.ExecuteScalar().ToString();
        }
    }
}

 

  本篇就大概介绍到这里,经常内容请关注后续系列博文,下一篇将介绍微软Bing Maps与空间数据的亲密接触,敬请期待~~~~





本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/520349,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
25天前
|
SQL Perl
PL/SQL编程基本概念
PL/SQL编程基本概念
13 0
|
7天前
|
SQL 人工智能 自然语言处理
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
|
29天前
|
SQL Go
SQL编程
SQL编程
9 0
|
1月前
|
存储 SQL
物料清单应用输入模板的SQL存储过程设计
物料清单应用输入模板的SQL存储过程设计
|
3月前
|
SQL Oracle 关系型数据库
Oracle PL/SQL基础知识及应用案例
Oracle PL/SQL基础知识及应用案例
33 0
|
4月前
|
SQL 关系型数据库 C语言
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
45 0
|
4月前
|
SQL 关系型数据库 数据库
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
47 0
|
4月前
|
SQL 关系型数据库 MySQL
SQL编程【MySQL 01】拆分列字段为行并根据类型翻译字段 > 1305 - FUNCTION x.help_topic_id does not exist 报错问题
SQL编程【MySQL 01】拆分列字段为行并根据类型翻译字段 > 1305 - FUNCTION x.help_topic_id does not exist 报错问题
33 0
|
4月前
|
SQL 关系型数据库 MySQL
【SQL编程】Greenplum 与 MySQL 数据库获取周几函数及函数结果保持一致的方法
【SQL编程】Greenplum 与 MySQL 数据库获取周几函数及函数结果保持一致的方法
37 0
|
4月前
|
SQL JSON 关系型数据库
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
50 0