几种注册ODBC数据源的方法
来源:未知编辑:未知2005年12月19日浏览454次
几种注册ODBC数据源的方法
国防科大丁浩
ODBC(Open Database Connectivity,开放式数据库互连)是一种应用程序接口(API) 规范。它定义了一个标准例程集,使用它们应用程序可访问数据源中的数据。应用程序通过引用API 的函数可以直接使用ODBC,或利用数据访问对象(DAO) 或远程数据对象(RDO) 来使用ODBC。但是,在实现ODBC 时,我们必须首先配置ODBC环境,进行数据源的注册,这样才能在对数据库进行编程时,对数据源进行连接、访问和操作。本文介绍几种常用的注册ODBC 数据源的方法。
手工配置
1.ODBC数据源管理器
在进行数据库开发时,为了达到配置ODBC,进行DSN定义注册的目的,微软给出了一个手工操作的解决方法。在Windows 9X操作系统的控制面板中,有一个名为“ODBC数据源(32位)”的图标,可以通过它激活专门为用户设置ODBC环境的程序(ODBC Data Source Administrator,ODBC数据源管理器)。在Windows 2000操作系统中,上述图标被放置在控制面板的“管理工具”里面。
这个用于设置ODBC环境的程序叫做桌面驱动程序,它支持数种DBMS (Database Management System,数据库管理系统)。当用户想增加一个数据源和一个所需要的驱动程序时,可以通过ODBC数据源管理器的配置对话框配置特定类型的数据库。大多数情况下,在编写对数据库操作的程序时,我们至少需要知道诸如数据库文件名、系统(本地或远程)、文件夹等信息,同时要给数据源命名。
2.定义数据源的类型
用户可以定义以下三种类型的数据源:
用户数据源:作为位于计算机本地的用户数据源而创建的,并且只能被创建这个数据源的用户所使用;
系统数据源:作为属于计算机或系统而不是特定用户的系统数据源而创建的,用户必须有访问权才能使用;
文件数据源:指定到文件中作为文件数据源而定义的,任何已经正确地安装了驱动程序的用户皆可以使用这种数据源。
3.数据源注册的步骤
以Microsoft Access为例,如果在C:\myfile\文件夹里创建了一个名为myexample.mdb的数据库文件,其注册步骤如下:
在控制面板里找到“ODBC数据源”图标,打开数据源管理器的交互界面;
笔者创建的数据库文件是供本机上的用户使用的,所以这里选择“用户DSN”;然后按下“添加”按钮,在弹出的数据源管理器对话框里,为自己所要创建的数据源选择一个驱动程序,本文的数据库文件是用Microsoft Access创建的,所以要选择“Microsoft Access Driver (*.mdb)”;
按“完成”按钮后,进入一个标题为“ODBC Microsoft Access 安装”的界面,在其中设置“数据源名”为“mydatasource”,选取数据库文件
“C:\myfile\myexample.mdb”,然后确定即可。
这样我们就完成了一个简单的ODBC数据源的注册。当然,在以上的步骤中,用户可以根据自己的不同需要,设置不同的选项。
注册结束后,我们便可以在对数据库的编程中,操作该数据库了。
在VB中注册数据源
在VB中对数据库进行编程时,可以利用RegisterDataSource方法为ODBC 数据源输入连接信息到Windows 注册表中。它的语法是:RegisterDataSource DSN, driver, silent, attributes
其中参数代表的含义分别为:
DSN:字符串表达式,它是在引用数据源描述信息块时所使用的名字。例如,如果数据源是一个ODBC远程数据库,这就是服务器的名字;如果是用户DSN,则是注册的数据源的名字。
drive:字符串表达式,表示ODBC驱动程序的名称。它并不是ODBC 驱动程序动态连接库(DLL) 文件名。例如,SQL Server 是驱动程序名,而SQLSRVR.DLL 是DLL 文件名。必须安装ODBC 及相应的驱动程序。silent:布尔类型值,如果不想显示ODBC 驱动程序对话框,用以提示指定驱动程序的信息,该值就为True;如果希望显示ODBC 驱动程序对话框,该值就为False。如果silent 为True,那么attributes必须包含所有必需的指定驱动程序的信息。
attributes:字符串表达式,它是一个要添加到ODBC.INI 文件中的关键字列表。编写程序时,可以根据需要选择若干attributes的参数进行设置。
例如:我们可以编写如下的VB程序,达到与上面手工注册一样的目的。程序清单如下:
Sub RegisterDataSource()
Dim strAttribs As String
’建造关键字字符串。
’C:\myfile\myexample.l.mdb数据库文件名(包含路径)
strAttribs =“DBQ=” _
&“C:\myfile\myexample.mdb” _
&Chr$(13) &“OemToAnsi=No” _
&Chr$(13) &“SERVER=SEQUEL” _
&Chr$(13) &“Network=DBNMPNTW” _
&Chr$(13) &“Database=WorkDB”_
&Chr$(13) &“Address=\ EQUEL\PIPE QL\QUERY”
’建立新的注册的DSN。
rdoEngine.rdoRegisterDataSource “mydatasource”,
“Microsoft Access Driver (*.mdb)”,True,
strAttribs
End Sub
Private Sub Form_Load()
Call rdoRegisterDataSource
End Sub
注意:为了在代码中使用rdoEngine和远程数据对象,必须先在“引用"对话框中设置一个到Microsoft Remote Data Object 2.0 对象库的引用,否则在第一次引用rdoEngine 对象时会导致编译错误。
利用注册表合并
1.解决思路
考查ODBC数据源注册后对Windows注册表的修改情况,我们可以发现所注册的数据源对Windows注册表的影响关键集中在[HKEY_CURRENT_USER oftware\ODBC\ODBC.INI]里。
这样,我们导出[HKEY_CURRENT_USER oftware\ODBC\ODBC.INI],每次以之为模板,把所要注册的数据源信息加入到注册表导出文件的对应位置,然后再将该文件与系统注册表合并即可。
2.具体操作
首先,我们要弄清楚Regedit 及其参数的含义。Regedit是打开系统注册表的命令。在“开始\运行\”中输入即可。它的三个参数含义如下:
Regedit /e myfile.reg :表示把注册表文件导出到myfile.reg 文件中,相当于复制整个注册表文件到myfile.reg中;
Regedit /c myfile.reg:表示把myfile.reg导入注册表,相当于用该文件的内容覆盖了注册表的内容;
Regedit /s myfile.reg :表示把myfile.reg文件的内容与注册表文件的内容进行合并。
我们只需在注册表中将有用的部分导出,而后将所要注册的数据源的信息加入,再与系统注册表合并就可以了。这个合并的过程,我们既可以手工输入来实现,也可以通过编程实现自动合并。
注意:为了防止误操作,一定要将系统注册表作一次备份。
小结
从安全的角度考虑,笔者首推利用在Windows控制面板中的ODBC数据源管理工具来进行数据源注册,以免因对注册表的不熟或疏忽造成不必要的损失。当然,还有一些应用工具,可以实现对ODBC数据源的注册,用户可以根据不同的需求选择使用。
小妹初学vb,想在vb 中用ODBC 连接一个access 数据库,现遇到一个问题:
在控制面板中设置好ODBC 后,分别尝试用data 和adodc 控件连接数据源(只在控件的属性上设置,没有写代码),都不行。
然后在网上找到一些代码写进去,却总是显示“实时错误[Microsoft][ODBC 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序”或者“找不到可安装的ISAM ”(可是我安装vb 时是装过ISAM 的!)
我的代码:
Private Sub Form_Load()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
conn.CursorLocation = adUseClient
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source =F:\db1.mdb"
rs.Open "select * from 表1", conn, adOpenDynamic, adLockBatchOptimistic
End Sub
烦请各位热心的大虾帮忙看看这个代码哪里不对呢?非常感谢!
作者:帅哥阳伞
专家分:8950
会员信息
发短消息
所属BLOG 发表时间:2006-6-1 19:19:00 [回复] [引用] 睿智汇海.NET 就业培训专家,2个月实现高薪梦想
第 1 楼
conn.ConnectionString = "Provider=MSDASQL;Persist Security Info=False;User ID=填用户名;Dat
a Source=填DSN 名" '通过ODBC 来连接
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source =F:\db1.m
db" 是连接数据库的
最后修改于2006-6-1 19:20:00
此帖尚未评分
作者:水蓝色月光
专家分:0
会员信息
发短消息
所属BLOG 发表时间:2006-6-2 9:15:00 [回复] [引用] 睿智汇海.NET 就业培训专家,2个月实现高薪梦想
第 2 楼
我把关键那句改成
conn.ConnectionString = "Provider=MSDASQL;Persist Security Info=False;User ID=admin;Data Sou rce=abc.dsn" 可是还是显示“实时错误[Microsoft][ODBC 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序”,我
在控制面板里的用户DSN 和文件DSN 选项卡都分别创建了一个叫abc.dsn 的文件了,选择的是access 的驱动器,为什么还总是说“未发现”呢?
作者:傻瓜911
专家分:30
会员信息
发短消息
所属BLOG 发表时间:2006-6-4 11:35:00 [回复] [引用] 睿智汇海.NET 就业培训专家,2个月实现高薪梦想
第 3 楼
shi 使用一个ADO 控件 来生成连接字符串,就可以了!
大傻瓜 cf99cf@https://www.wendangku.net/doc/0c1004769.html, QQ:215150795
此帖尚未评分
作者:huangsten
专家分:90
会员信息
发短消息
所属BLOG 发表时间:2006-6-7 2:51:00 [回复] [引用] 睿智汇海.NET 就业培训专家,2个月实现高薪梦想
第 4 楼
可以用数据环境设置器就能得到连接数据库的字符串。
1.在工具栏中单击工程
2.单击添加Data Environment,在工程资源管理器中生成了一个DataEnvironment1
3.右键单击Connection1
4.单击属性,弹出一个数据链接属性窗口
5.如果数据库是access就双击Microsoft Jet 4.0(省略...)
6.跳到连接项,在文本框中输入数据库路径,如果数据库和工程在同一路径,则输入数据库名称即可
7.如登陆数据库需要密码,则在第二点的文本框输入相应信息
8.点击测试连接按钮
9.如果连接成功则提示连接成功
10.成功后按确定按钮退出
11.连接数据库的字符串只有复制属性窗口的ConnectionSource的值就行了
此帖尚未评分
作者:billyli
专家分:30
会员信息
发短消息
所属BLOG
发表时间:2006-6-9 14:14:00 [回复][引用]
睿智汇海.NET就业培训专家,2个月实现高薪梦想
第 5 楼conn.ConnectionString="DSN=abc;uid=;pwd="
'通过ODBC来连接
此帖尚未评分
作者:louja
专家分:20
会员信息
发短消息
所属BLOG
发表时间:2006-6-9 17:49:00 [回复][引用]
睿智汇海.NET就业培训专家,2个月实现高薪梦想
第 6 楼顶三楼
使用AO连接ORACLE数据库
昨天做了个程序,是将一个本地SHP文件和一个SDE上的表进行匹配比较,然后生成一个新的SDE要素类。其中涉级到使用AO连接ORACLE数据库的问题和如何从数据库中取出一个表的操作,代码贴下来给大家看看:
连接数据库,首先需要了解AO操作数据的基本流程:AO的geodatabase数据模型具有独立性,与具体的存储介质无关,即无论是数据库管理还是文件存储数据,AO都是使用相同的操作方式来管理数据的。在geodatabase中,workspace相当于一个数据库,这个数据库存储的东西很多,如要素数据集、要素类,栅格数据集,表等等。(具体的可看OMD图)
1.使用AO连接到SDE+ORACLE数据库
Private Sub getSDETable()
使用SDE的工作空间工厂,不同类型的数据库连接的时侯使用不同的工厂对象
Dim pWorkspaceFactory As IWorkspaceFactory
pWorkspaceFactory = New SdeWorkspaceFactory
Dim pPropertySet As IPropertySet
pPropertySet = New PropertySet
With pPropertySet
.SetProperty("Server", "data") 服务器
.SetProperty("Instance", "5151/tcp") 实例
.SetProperty("user", "sde") SDE数据表空间的用户名
.SetProperty("password", "sde")
.SetProperty("version", "sde.DEFAULT") 默认版本
End With
定义要素工作空间
Dim pSdeWorkspace As IFeatureWorkspace
Try
pSdeWorkspace = pWorkspaceFactory.Open(pPropertySet, 0)
Catch ex As Exception
MessageBox.Show("SDE Cann't Connection")
End Try
取出一个表
Dim pTable As ITable
pTable = pSdeWorkspace.OpenTable("NHGTWEB.WEB_YQLJ")
If pTable Is Nothing Then
MessageBox.Show("Connection Error")
Else
看取出每条记录的方法
Dim pCursor As ICursor
pCursor = pTable.Search(Nothing, False)
Dim pRow As IRow
pRow = pCursor.NextRow
Do While Not pRow Is Nothing
取出表中的每一条记录,加到一个COMBOBOX中去
UiComboBox1.Items.Add(pRow.Value(2))
pRow = pCursor.NextRow
Loop
End If
End Sub
如果要去要素类很多帮助里面都可以看到,可是取一个table就没看到过例子,我其实对于取一个表要通过ifeatureworkspace接口也是很迷惑,因为在OMD图中,featureclass是table 的子类,这样在workspace里面应该有专门管理table的接口,但是没有哦。
2.使用AO连接普通的ORACLE数据库
Private Sub getORACLE()
Dim pWorkspaceFactory As IWorkspaceFactory
pWorkspaceFactory = New OLEDBWorkspaceFactory
Dim pPropertySet As IPropertySet
pPropertySet = New PropertySet
pPropertySet.SetProperty("CONNECTSTRING", "Provider=oraoledb.oracle;Data Source=nhgtfc;User Id=nhgtfc;Password=nhgtfc")
Dim pWorkspace As IFeatureWorkspace
pWorkspace = pWorkspaceFactory.Open(pPropertySet, 0)
If pWorkspace Is Nothing Then
MessageBox.Show("connect error!")
Else
pTable = pWorkspace.OpenTable("NHGTZYJ_TDJBXX")
End If
End Sub
这里打开工作空间使用的是另一种工作空间工厂,但是打开后使用的方法是一样的。其实无论是那里的表,其管理方法都是一致的。
Tags:
发布:jbttm | 分类:ArcObjects开发 | 评论:13 | 引用:0 | 浏览: 43 | 字号:大中小
?相关文章
?该日志的引用地址(UTF-8)及评论订阅地址:
?https://www.wendangku.net/doc/0c1004769.html,/cmd.asp?act=tb&id=30
https://www.wendangku.net/doc/0c1004769.html,/cmd.asp?act=rss&id=30
ArcSDE安装全攻略
(作者: 陈元琳)
有很多朋友安装ArcSDE失败,主要有以下两种情况:
1 ArcSDE安装过程中提示不成功。
2 ArcSDE已经装上,但是服务没有启动。
为此,我把ArcSDE反复安装了多次,对期间可能出现的问题一一找到了解决办法。现在把安装步骤写出来,希望不光对第一次安装ArcSDE的朋友,而且对已经安装过ArcSDE却没有成功的朋友,都能有一定的帮助。当然这只是抛砖引玉,如有错误还请各位指正。
Windows操作系统中解决方案如下:
1 打开注册表,删除ArcSde Service服务
详细:
(1)打开“控制面板”,“服务”,找到“ArcSde Service(somename)”,这里somename就是你的ArcSde服务的真实的名字,记住这个名字(为叙述方便,以下用somename表示其真实的名字)。
(2)打开“开始”,“运行”,敲入“regedit”,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Ser vice\somename,把整个文件夹删掉。(这里的somename指(1)中的somename。)
(3)重启计算机。(目的是刷新注册表,当然用其他方法树新注册表也可以,但是这里强烈建议重启。)
2 从Oracle中删掉用户sde和表空间sde
详细:
(1)从“开始”--〉“程序”--〉“Oracle - OraHome92”--〉“Enterprise Manager Console”,启动Oracle,以任意用户名,任意密码,SYSDBA身份登陆(以SYSDBA身份登陆无需验证的原因是:SYSDBA是操作系统认证的,操作系统里面有一个ora_dba组,这个组里面Members can connect to the Oracle databas e as a DBA without a password,如果把你刚才登陆本机时所使用的用户名从这个组里删除,那么你以S YSDBA身份登陆Oracle就需要身份验证了)。
(2)在“安全性”--〉“用户”下找到“SDE” (如果找不到就进行下一步),在“SDE”上右健单击,选择“移去”,选择“是”,这样就删掉了用户SDE。
(3)在“存储”--〉“表空间”下找到“SDE” (如果找不到就进行下一步),在“SDE”上右健单击,选择“移去”,选择“是”,这样就删掉了表空间SDE。
(4)关闭Oracle。
3 重新安装ArcSDE
详细:
(1)从“开始”--〉“程序”--〉“ArcGIS”--〉“ArcSDE”--〉“ArcSDE for Oracle9i Post Installation”,进入安装
界面。
(2)第一步,选择完全安装,即“Complete”,点击“下一步”。
(3)第二步,要求以Oracle用户sys的身份登陆Oracle数据库。在Sys user password中输入用户sys 的密码(安装Oracle时输入的);在Net service name中输入Oracle服务的名字,可以以如下方式查看Oracle服务的名字:“控制面板”-->“管理工具”--〉“服务”,找到“OracleServiceSomename2”字样的服务(其中,Somename2只是一个替代字符串),右键点击“属性”,在弹出的对话框中,看到“可执行文件的路径”下面的字符串,此字符串中“.EXE ”后面的部分即是Oracle服务的名字。点击“下一步”。
(4)第三步,创建SDE表空间和用户(如果弹出一个对话框,显示用户sde已经存在,那是因为用户sd e或表空间sde没有从Oracle中删掉)。对话框中给出三栏:SDE user、Default和File。其中,Default 栏指出要创建的默认的SDE用户名和表空间名,SDE user栏输入的是用户sde的密码,File栏给出的是新创建的用户和表空间存放位置的文件。
强烈建议不要修改Default栏给出的“sde”,因为如果改成其它的名称,一会儿在(8)中将会看到要求给出用户sde的密码,而我们并没有创建用户“sde”。
笔者私下认为SDE user栏和Default栏给出的提示不很好,粗一看去让人误以为要填两个用户名,一个是运行使用的用户名,一个是默认的用户名。但实际上SDE user栏中输入的字符以星号显示,按默认惯例,这一栏应该是密码。而且,在刚进入(6)时,我们可以打开Oracle,可以看到“用户”下的确生成了Defau lt栏输入的名字的用户,而不是SDE user栏输入的名字的用户,在表空间中也是如此。
我们可以只在SDE user栏输入一个字符串,当作用户“sde”的密码,其余的默认即可。点击下一步。
(5)一会儿可以看到弹出两个对话框,提示用户sde和表空间sde创建成功。
(6)第四步,进入“ArcSDE configuration files”,配置ArcSDE文件,选择默认,点击下一步即可。
(7)第五步,进入“ArcSDE configuration files continued”,继续配置ArcSDE文件,选择默认,点击下一步即可。
(8)第六步,创建方案SDE。此时,SDE用户的名字已经固定,为“sde”;程序在(4)中已经获得用户“sde”的密码,此处也以星号形式给出;程序在(3)中已经获得Oracle服务的名称,此处也显示给出。如果(3)和(4)中均没有填错,此处全部默认即可,点击“下一步”。
(9)第七步,创建ArcSDE服务,全部默认即可,但最后一项“Oracle_SID”必须填,而且要填正确,否则ArcSDE服务即使创建了也不能启动。可以用如下方法查看系统已经安装的Oracle的SID:在Oracle安装路径下的“\admin\sde\profile”文件夹下,有一个“init.ora.*************”字样的文件(比如,在我的机器上该文件为D:\oracle\admin\SDE\pfile\init.ora.6162005101919),用文本文件方式打开,查找字符串“ins tance_name”,可以看到“instance_name=somename3”字样的值,这个somename3就是Oracle_SID。填好后点击“下一步”。
(10)如果原来有ArcSDE服务,那么此时会提示已经存在服务,是否覆盖;或者提示出错。原因:第1步即“打开注册表,删除ArcSde Service服务”仅仅把控制面板服务列表中的服务删掉,而真正的服务(在HKEY_LOCAL_MACHINE\SOFTWARE\ESRI\ArcInfo\ArcSDE\8.0\ArcSDE for Oracle下,)还是没删掉,所以会提示是否覆盖。如果第1步没有执行,即服务列表中的ArcSDE服务没有删掉,就会提示出错。
(11)在以上执行步骤中,由于没有删掉HKEY_LOCAL_MACHINE\SOFTWARE\ESRI\ArcInfo\ArcSDE\8.0\ ArcSDE for Oracle下的ArcSDE的真正服务,所以提示是否覆盖。点击“是”,一会儿后弹出对话框,提示耐心等待,询问是否启动新创建的ArcSDE服务,选择“是”,一会儿后提示服务成功启动。
(12)提示安装完成。此时可以到服务列表(“控制面板”--〉“管理工具”--〉“服务”)中,找到“ArcSDE Se rvice(somename4)”(somename4是(9)中出现的ArcSDE服务的名字,默认为esri_sde),可以看到确实正常启动了。如果哪位朋友照以上步骤安装后,服务仍未启动,请与我(陈元琳)联系,E-Mail:___cyl@163. com
补漏:
以上主要针对Oracle数据库中只有一个数据库的情况,如果有多个数据库,比如有两个:SDE和TestDB,那么以上安装步骤会有一些小小的改动,如下:
A 从Oracle中删掉用户sde和表空间sde时需要选择数据库,你原来把sde用户和表空间建在哪个数据库(即安装ArcSDE第二步时填写的Net service name)中,现在就先登陆那个数据库,然后再在那个数据库下进行删除sde表空间和用户的操作。
B 安装ArcSDE的第二步至第六步(即(1)-(8)),填写的Net service name应该相同,此时在“服务”列表中可以看到有“OracleServiceSDE”和“OracleServiceTestDB”,Net service name 应该要么是“SDE”,要么是“TestDB”
C 安装ArcSDE的第七步(即(9)),填写的“Oracle_SID”也应该跟前面安装过程中填写的Net service name对应的服务所对应的Oracle数据库的SID相同。(Oracle数据库的SID可以在打开“Oracle Enterpr ise Manager Console”后看到:“网络”—〉“数据库”根目录下的便是Oracle数据库的全部SID。)经笔者测试,如不如此,ArcSDE服务便不能启动。
重要说明:得出以上结果,软件环境为:ArcSDE 8.3 for Oracle 9i,Windows XP Professional Server P ack 2,Oracle 9.02 。
本文发表于《3s新闻周刊》第5期,有删节,严禁非通告转载。
另,《3s新闻周刊》第7-8期(合集)即将推出,敬请关注。
前些天,把Python从版本2.3升级到了2.4。之后因为在看ArcObject的文档,用ArcToolbox的空间统计分析却发现不能用,ArcGIS提示要安装Python。ArcGIS 9新增的空间统计分析是基于Python实现,而其机理,是使用类似Shell调用方式实现,但不知由于什么原因,非常脆弱。笔者是Python的Fans,Python 的使用频率远大于ArcGIS,而且使用的版本比ArcGIS自带的版本高,因此,这样的情景也不是第一次遇到了。通过重新注册py文件类型有时可以解决问题,有时却不可以,ArcGIS的文档里也没有找到类似问
题的说明,从网上也没有找到解决办法。
前几天demo@virushuo在自己的Blog里说如果可以选择,系统架构一定不选择Windows,因为其复杂性,“Windows是一个无法完全理解的系统”。那么,对照GIS领域,ArcGIS大概就是这样一个对应物。综观ESRI的产品线,我们可以看到,其产品已涵盖了GIS相关的方方面面,而同时也难免“大而无当”。
所以,一方面对ESRI的溢美之词随处可见,另一方面,对ESRI的批评和Anti-ESRI也并不新鲜,下面是2、3年前笔者从国内几个论坛上摘录下来的几条言论:
“Jack Da ngermond , 大概所有的GIS人都知道,ESRI的主席,牢牢控制一手创办的ESRI。以我个人观点Arc软件为什么有这么混乱的命名规则,这么用户不友好的界面和不符逻辑的操作跟他的公司性质大有关系,试想如果没有投资人和市场的压力他会花很多精力考虑产品的marketing 和usability么?所以ArcGIS的用户们只有继续忍下去了。”
“众所周知ESRI的产品纷繁复杂。当ArcGIS都数不过来,什么MO、AO、SDE、IMS、ArcMap、ArcCatolag、ArcSense等等,其中还设置了好多版本权限,如ArcView、ArcEditor,ArcInfo等,一度让用户思想混乱,ESRI更多的时候是采取一种霸市的做法。”
“不要把ESRI当成什么技术革新者。至少近十年来,ESRI的保守在业界内部可算是闻名的。”
这些言论也许片面,但都说出了部分事实,即GIS软件的不友好。正是这种不友好,才使得Google Earth 这样的软件引起了如此广泛的关注和好评。
ESRI从1997年开始用COM组件技术将已有的GIS产品进行重组,于1999年底推出了ArcGIS 8,之后,逐渐将产品线构筑于基于COM的ArcObject之上。这一举措,带来的最大好处是大多数基于空间数据的应用,都可以基于ArcObject以及其上层产品构建,使得ESRI可以进入利润丰厚的企业市场。
但市场似乎没有完全按照ESRI的预料发展,首先,企业市场的主流技术目前是J2EE和.net,COM/DCOM 正在退出市场,因此,每一版本的ArcGIS产品,都必须开发对应的Java和.net接口;其次,网络地图的发展使得业界巨头们开始窥伺这个市场;最后,与封闭的GIS系统相对,开源空间信息软件逐渐获得了很多人的认可,特别是2005年末Autodesk把自己的MapGuide开源,开源地理信息基金会的成立,更是使
开源GIS深入人心。
相对于ESRI,轻装上阵的Mapinfo在推出了基于ActiveX组件技术的MapX后,MapXtreme的Windows、Java、.net版本也先后推出,在LBS相关领域取得了不俗的成绩;国内的SuperMap,抓住组件技术这一机遇,也取得了不错的成绩。从这个角度,ESRI选择COM和DCOM来重组自己的产品可谓喜忧参半。
2005年,随着Google、Yahoo、Microsoft等进入网络地图行业,GIS从IT领域的角落进入了前台,带给GIS厂商的除了机遇,更是挑战。我们也欣喜的看到,ESRI对此的积极反映。面向服务,融入IT主流,而开放、免费(Google Earth、ArcGIS Explorer),这些对于GIS业界相对陌生的词语开始变得流行,对于用户、对于大众无疑是很好的事情。
和ESRI一样,GIS行业也处在一个十字路口,何去何从是每个对于从业者都需要考虑的问题。如何为自己定位,找到一个合适的方向;对于大大小小的公司,又如何保持竞争力。而这也是我们选择ESRI作为这一期主题的理由。
最后以一个例子和一句话作为结尾。和ESRI类似的一个公司是SAS,一样的私有公司,从统计软件起家,目前主要面向商业智能(BI)、数据挖掘等领域,2005年取得了不俗的业绩,其中SAS中国的业绩增长了100%。避开业界巨头的锋芒,专注与自己的领域,并深入应用,大概就是IT业界的“丛林求生法则”。李开复先生在DoNews 6周年英雄大会上所说的“我去google几个月以来,明白了一点,只有技术才是持续的竞争力。”,我想,不管是对于Google或者SAS,还是对于GIS行业,都可以使用这句话作为注解。
后记,由于一些原因,现在开始看ArcObject的一些文档,回过头来发现,实际上,也许ArcObject确实不错,功能强大,但由于其陡峭的学习曲线,实在不是一个易用的开发平台,此为其一;其二,一个系统,如果太大,必定会有很多不周全的地方,过度设计,设计不足等等,AO大概也不能避免。
Oracle Spatial中上载GIS空间数据方法研究
摘要:采用Oracle Spatial 存储、管理空间数据,易于解决数据共享、分布式处理、网络通信、开放式开发、并发控制、网络化集成、跨平台运行及数据安全恢复机制等方面的难题,因而成为了目前的一种应用趋势。而如何将现有GIS软件..
摘要:采用Oracle Spatial 存储、管理空间数据,易于解决数据共享、分布式处理、网络通信、开放式开发、并发控制、网络化集成、跨平台运行及数据安全恢复机制等方面的难题,因而成为了目前的一种应用趋势。而如何将现有GIS软件中产生的空间数据导入该数据库中成为该技术应用的首要关键环节。本文以此为出发点,在探讨了向Oracle Spatial 上载GIS 的空间数据的基本原理的基础上,较全面地介绍了在Oracle Spatial中上载矢量数据与栅格数据的各种方法,重点介绍了使用Microsoft的ADO接口、Oracle Spatial的Java API及OCCI接口等手工方式上载程序的实现过程。最后,给出了全文的结论及相关的建议。
1引言
空间数据是GIS的血液,对空间数据的管理的好坏将直接影响到GIS系统质量的高低。GIS空间数据的管理经过了纯文件方式管理图形数据与属性数据、图形数据文件方式管理与属性数据关系型数据库管理、空间数据与属性数据一体化的管理方式三个阶段。目前,大多数GIS 软件都逐渐倾向于采用第三种管理方式,也就是图形数据与属性数据都采用数据库管理的
方式。例如,采用Oracle Spatial、DB2 Spatial Extender、Informix Spatial DataBlade(目前Informix已经被IBM收购)以及ArcSDE数据库引擎、MapGIS MapORA引擎等等。
Oracle Spatial提供了对象-关系模式和关系模式两种方式来存储空间数据。前者的特征是空间表中有一个类型为MDSYS.SDO_GEOMETRY的字段,后者也就是Spatial的早期版本空间数据暗盒(Spatial Cartridge),其特征是每一个空间几何图层对应四个表,分别为_SDOLAYER、_SDODIM、_SDOGEOM与_
SDOINDEX。这些表并不包括属性数据,属性数据需建立连接。目前许多GIS软件公司都提供了对Oracle Spatial的支持,比如Intergraph的GeoMedia 4.0、MapInfo的MapInfo 6.0、AutoDesk的MapGuide 6.0、ESRI的ArcSDE、ArcGIS以及国内中地公司的MapGIS 6.5等。
本文主要研究上载GIS的矢量数据和栅格数据到Oracle Spatial的原理与具体的各种实现方法,并在编程实践的基础上比较几种上载方法的优点与不足。
2 向Oracle Spatial上载GIS空间数据的原理
向Oracle Spatial上载GIS空间数据,其实质也就是把空间数据的图形数据(包括矢量数据与栅格数据)与相应的属性数据写入数据库的表格中。因此,在上载前必须清楚GIS空间数据的数据格式与Oracle Spatial中空间数据是如何存储的。
每个GIS软件拥有自己的内部数据格式和数据存储方式,大部分GIS软件并不向用户直接提供读写内部数据的函数。为了与其它软件进行数据转换,通常定义一种外部数据交换格式,如MapInfo的*.mif/*.mid、MapGIS 的明码格式与ESRI的Shape格式(非ASCII码格式)等等。这些外部交换格式大部分为ASCII码文件,关于这些交换格式的数据结构的详细请参阅其公司发布的说明文档。
Oracle Spatial是一个对象-关系数据库,提供存储空间数据的类型是SDO_GEOMETRY。随着Oracle 10g的推出,又给Spatial扩充了拓扑数据模型、网络数据模型与栅格数据模型,每种数据模型都有其各自的数据类型,比如类型SDO_TOPOGEOMETRY用来存储拓扑数据等。在上载前一定要清楚这些数据类型的属性与方法,详细信息请参考文献1、2、3。
3 向Oracle Spatial上载GIS空间数据的方法
上载空间数据的方法,总的来说可以分为使用GIS软件公司提供的工具与手工的方式上载两种方法。本节主要介绍矢量数据与栅格数据的各种上载方法及其具体的实现过程。
3.1 矢量数据的上载方法
3.1.1 使用手工的方式实现上载
用户可以使用交互式的SQL语句上载GIS空间数据,使用这种方法也就是使用各种应用程序编程接口(如ADO、ODBC等等)来上载,用户可以
以自己的应用需要为导向使用开发语言调用这些接口开发出各种各样的上载工具,即实现手工方式的加载。本小节介绍了重点介绍使用Microsoft 的ADO接口以及Oracle Spatial的Java API和OCCI接口实现空间数据的上载的实现过程。
3.1.1.1 使用Java API上载
Oracle Spatial的Java API(Application Programing Interface)提供了3个类,即JGeometry、JGeometry.Point与DataException。JGeometry类对应于Oracle Spatial的对象类型MDSYS.SDO_GEOMETRY,JGeometry.Point类对应于对象类型MDSYS.SDO_POINT_TYPE, DataException类表示异常。下面的示例演示了如何使用Java API实现将GIS的空间数据写入Oracle Spatial 中:
/// 从数据库中读取空间数据
ResultSet rs = statement.executeQuery("SELECT geoloc FROM countries where name='China'");
STRUCT st = (oracle.sql.STRUCT) rs.getObject(1);
//把结构体转换为geometry 对象
JGeometry j_geom = JGeometry.load(st);
// ... 在空间对象上执行空间操作或者创建新的空间对象...
/// 向数据库中存储空间对象
PreparedStatement ps = connection.prepareStatement("UPDATE countries set geometry=? where name=' China '");
//把JGeometry对象转换为数据库的结构体。
STRUCT obj = JGeometry.store(j_geom, connection);
ps.setObject(1, obj);
ps.execute();
3.1.1.2 OCCI上载示例
该上载示例是使用OCCI(Oracle C++ Call Interface)上载空间数据的完整示例程序。首先使用Oracle数据库数据类型翻译工具OTT(Oracle Type Translator)翻译类型MDSYS.SDO_POINT_TYPE与类型MDSYS.SDO_GEOMETRY,在命令行下输入,
ott attraccess=private code=cpp cppfile=spatial_classeso.cpp hfile=spatial_classesh.h intype=spatial_types.typ mapfile=spatial_classesm.cpp mapfunc=RegisterClasses userid=scott/tig
er@gis
命令成功执行以后,就会生成4个文件,分别为spatial_classesh.h、spatial_classeso.cpp、spatial_classesm.h、与spatial_classesm.cpp;
然后,在scott用户模式下创建空间表格(即存储空间数据的表格)spatial,实现的SQL语句如下:
CREATE TABLE spatial(geoloc MDSYS.SDO_GEOMETRY);
最后,利用VC++建立一个工程,把前面翻译的文件spatial_classesh.h、
spatial_classeso.cpp、spatial_classesm.h、与spatial_classesm.cpp添加到工程中。主文件的内容为,
#include
#include
#include
#include
#include "spatial_classesh.h"
#include "spatial_classesm.h"
using namespace std;
using namespace oracle::occi;
const int SDO_GTYPE_2DPOINT = 2001;
const int SDO_GTYPE_2DPOLYGON = 2003;
const int SDO_ETYPE_POLYGON = 1003;
const int SDO_INTERPRETATION_RECTANGLE = 3;
void main()
{try
{//以OBJECT模式初始化环境变量
Environment *env = Environment::createEnvironment(Environment::OBJECT); RegisterClasses(env);//注册类型函数
Connection *conn = env->createConnection("scott","tiger","gis");