配置ODBC数据源
ODBC管理器(Administrator)它负责安装驱动程序,管理数据源,并帮助程序员跟踪ODBC的函数调用。在ODBC中,应用程序不能直接存取数据库,它必须通过管理器和数据库交换信息。ODBC管理器负责将应用程序的SQL语句及其他信息传递给驱动程序,而驱动程序则负责将运行结果送回应用程序。运行32bit ODBC管理器后,出现一个主对话框,它的主要内容是要求用户输入一个数据源,所谓数据源就是数据库位置、数据库类型以及ODBC驱动程序等信息的集成。数据源负责将运行结果送回应用程序。应用程序、ODBC管理在使用之前必须通过ODBC管理器进行登记和连接,启动ODBC管理器后,选取Add按钮,根据自己的数据库类型,选择相应的ODBC驱动程序,然后输入数据源名(Data Source Name)和数据库文件名(Database Name),完成这些步骤后,以后的应用程序就能够通过ODBC管理器的数据源直接操纵数据库。
在Window95或者98下,ODBC管理器在控制面板里面的32bit ODBC。而在WINDOW2000下,ODBC管理器是在程序à管理工具à数据源(ODBC)中。第一次找它费了我好大的力气。后来动用了搜索才找到的。(想想自己还真够笨的。L)下面以Window2000下的ODBC管理器为例,介绍一下每一页的用途:
1、 用户DSN:ODBC用户数据源存贮了如何与指定数据库提供者连接的信息。只对当前用户可见,而且只能用于当前机器上。这里的当前机器是只这个配置只对当前的机器有效,而不是说只能配置本机上的数据库。它可以配置局域网中另一台机器上的数据库的。
2、 系统DSN: ODBC系统数据源存贮了如何指定数据库提供者连接的信息。系统数据源对当前机器上的所有用户都是可见的,包括NT服务。也就是说在这里配置的数据源,只要是这台机器的用户都可以访问。
3、 文件DSN:ODBC文件数据源允许用户连接数据提供者。文件DSN可以由安装了相同驱动程序的用户共享。这是界于用户DSN和系统DSN之间的一种共享情况。
4、 驱动程序:这页列出了本机上所有安装的数据库驱动程序。里面列举了每个驱动程序的名称,版本,提供商公司,驱动程序文件名,以及安装日期。
5、 跟踪:ODBC跟踪允许创建调用ODBC的日志,提供给技术人员查看。里面可设定日志的路径和文件名。技术人员通过这里面的信息可以看到本机上所有的数据库访问的时间,用户,以及出错信息等情况。也可以通过这个辅助调试应用程序,可以启动Visual Studio的分析器,来进行ODBC的跟踪。
6、 连接池:连接池允许应用程序重用原来打开的的连接句柄,这样可以节省到服务器的往返过程。
7、 关于:最后这一页列出了所有的ODBC的核心文件。
ODBC管理器(Administrator)它负责安装驱动程序,管理数据源,并帮助程序员跟踪ODBC的函数调用。在ODBC中,应用程序不能直接存取数据库,它必须通过管理器和数据库交换信息。ODBC管理器负责将应用程序的SQL语句及其他信息传递给驱动程序,而驱动程序则负责将运行结果送回应用程序。运行32bit ODBC管理器后,出现一个主对话框,它的主要内容是要求用户输入一个数据源,所谓数据源就是数据库位置、数据库类型以及ODBC驱动程序等信息的集成。数据源负责将运行结果送回应用程序。应用程序、ODBC管理在使用之前必须通过ODBC管理器进行登记和连接,启动ODBC管理器后,选取Add按钮,根据自己的数据库类型,选择相应的ODBC驱动程序,然后输入数据源名(Data Source Name)和数据库文件名(Database Name),完成这些步骤后,以后的应用程序就能够通过ODBC管理器的数据源直接操纵数据库。
在Window95或者98下,ODBC管理器在控制面板里面的32bit ODBC。而在WINDOW2000下,ODBC管理器是在程序à管理工具à数据源(ODBC)中。第一次找它费了我好大的力气。后来动用了搜索才找到的。(想想自己还真够笨的。L)下面以Window2000下的ODBC管理器为例,介绍一下每一页的用途:
1、 用户DSN:ODBC用户数据源存贮了如何与指定数据库提供者连接的信息。只对当前用户可见,而且只能用于当前机器上。这里的当前机器是只这个配置只对当前的机器有效,而不是说只能配置本机上的数据库。它可以配置局域网中另一台机器上的数据库的。
2、 系统DSN: ODBC系统数据源存贮了如何指定数据库提供者连接的信息。系统数据源对当前机器上的所有用户都是可见的,包括NT服务。也就是说在这里配置的数据源,只要是这台机器的用户都可以访问。
3、 文件DSN:ODBC文件数据源允许用户连接数据提供者。文件DSN可以由安装了相同驱动程序的用户共享。这是界于用户DSN和系统DSN之间的一种共享情况。
4、 驱动程序:这页列出了本机上所有安装的数据库驱动程序。里面列举了每个驱动程序的名称,版本,提供商公司,驱动程序文件名,以及安装日期。
5、 跟踪:ODBC跟踪允许创建调用ODBC的日志,提供给技术人员查看。里面可设定日志的路径和文件名。技术人员通过这里面的信息可以看到本机上所有的数据库访问的时间,用户,以及出错信息等情况。也可以通过这个辅助调试应用程序,可以启动Visual Studio的分析器,来进行ODBC的跟踪。
6、 连接池:连接池允许应用程序重用原来打开的的连接句柄,这样可以节省到服务器的往返过程。
7、 关于:最后这一页列出了所有的ODBC的核心文件。
解决方案 »
- sql server 2005 标准版是否可以安装在windows xp操作系统中?sql server 2005开发版不生产服务,这个所谓的生产服务到底什么意思
- 请问分离了的数据库怎么才能再使用
- 请高手指教
- 财务收费系统的日志存储表设计?
- 从上表查询得到下表,如何写?
- 一个比较菜的问题,问高手
- 不允许从数据类型 smallmoney 到 nvarchar 的隐性转换。请使用 CONVERT 函数来运行此查询。
- 请问各位,sqlserver里2002-08-29 0:00:00为什么成了2002-08-29
- SQL 语句 关于execute(@sql),ji
- 请教:我很想知道一个数据库文件的格式,(该文件格式不是常用的…………
- 权限问题....?????
- ASP程序如何让用户作多步撤消处理?
通过ODBC,可以很方便的编写Client/Server两层体系结构下的数据库应用程序,能够满足很多现实的需求。另一方面,随着计算机技术的发展,三层,或者四层体系结构也开始提出并应用的具体的实际中,这时候,仅仅是依靠ODBC就显的不够了。这里我们不讨论多层体系结构的问题,我们讨论的是在多层体系结构下的数据库访问方法。
有人说,这些方法将会取代ODBC,我觉得不太可能,如果一定要说的话,用扩展这个词可能会更好一些。因为ODBC已经成为了关系数据库访问的一个事实上的标准,别的方法也都或多或少的使用了ODBC的东西。虽然现在关系数据库以后又出现了很多面向对象数据库等等的新型数据库系统。但是都还在研究阶段,没有真正的投入到应用上来。 DAO(Data Access Objects)数据访问对象是第一个面向对象的接口,它显露了Microsoft Jet数据库引擎(最早是给Microsoft Access所使用,现在已经支持其它数据库),并允许开发者通过ODBC象直接连接到其他数据库一样,直接连接到Access表。DAO最适用于单系统应用程序或小范围本地分布使用。 RDO(Remote Data Objects)远程数据对象是一个到ODBC的、面向对象的数据访问接口,它同易于使用的DAO style组合在一起,提供了一个接口,形式上展示出所有ODBC的底层功能和灵活性。尽管RDO在很好地访问Jet或ISAM数据库方面受到限制,而且它只能通过现存的ODBC驱动程序来访问关系数据库。但是,RDO已被证明是许多SQL Server、Oracle以及其他大型关系数据库开发者经常选用的最佳接口。RDO提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。 ADO(ActiveX Data Object)是DAO/RDO的后继产物。ADO 2.0在功能上与RDO更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO“扩展”了DAO和RDO所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。例如,ADO没有与rdoEngine和rdoEnvironment对象相等同的对象,可以显露ODBC驱动程序管理器和hEnv接口。尽管事实上您的接口可能是通过ODBC OLE DB服务提供程序实现的,但您当前也不能从ADO中创建ODBC数据源。
注意 所有后面带有星号 (*) 的对象都是同时应用于 ADO Recordset 类型库 (ADOR) 的对象。
· Command 对象 包含关于某个命令,例如查询字符串、参数定义等的信息。Command 对象在功能上和 RDO 的 rdoQuery 对象是相似的。
· Connection 对象 包含关于某个数据提供程序的信息。Connection 对象在功能上和 RDO 的 rdoConnection 对象是相似的,并且包含了关于结构描述的信息。它还包含某些 RDOEnvironment 对象的功能,例如 transaction 控件。
· Error 对象 包含数据提供程序出错时的扩展信息。Error 对象在功能上和 RDO 的 rdoError 对象是相似的。
· Field 对象* 包含记录集中数据的某单个列的信息。Field 对象在功能上和 RDO 的 rdoColumn 对象是相似的。
· Parameter 对象 包含参数化的 Command 对象的某单个参数的信息。该 Command 对象有一个包含其所有 Parameter 对象的 Parameters 集合。Parameter 对象在功能上和 RDO 的 rdoParameter 对象是相似的。
· Property 对象* 包含某个 ADO 对象的提供程序定义的特征。没有任何等同于该对象的 RDO,但 DAO 有一个相似的对象。ADO 对象可以具有两种属性:
· Built-In 属性:ADO 的"本地"属性。也就是说,任何使用熟悉的 MyObject.Property 语法的新对象都可以立即使用的 ADO 中的属性。Built-in 属性并不在某个对象的 Properties 集合中以 Property 对象的形式出现,因此尽管您可以修改它们的值,您却不能修改它们的特性或将它们删除。
· Dynamic 属性:ADO 的非本地属性,它们是由下一级数据提供程序定义的。它们出现在合适的 ADO 对象的 Properties 集合中。
例如,一个数据提供程序特有的属性可能指明某个 Recordset 对象是支持事务还是支持更新。这些附加的属性在 Recordset 的 Properties 集合中以 Property 对象的形式出现。Dynamic 属性只能用 MyObject.Properties(0) 或 MyObject.Properties("Name") 语法通过集合来引用。不同的数据提供程序可能提供一个或多个特殊的属性,来处理提供程序特有的操作。
· Recordset 对象* Recordset 对象包含某个查询返回的记录,以及那些记录中的游标。Recordset 对象在功能上和 RDO 的 rdoResultset 对象相似。您可以在不用显式地打开 Connection 对象的情况下,打开一个 Recordset(例如,执行一个查询)。不过,如果您选择创建一个 Connection 对象,您就可以在同一个连接上打开多个 Recordset 对象。
· 建立到某个数据库的连接
· 运行一个基本查询注意 部分示例引用了某个窗体上的附加控件,例如一个 MSHFlexGrid 控件或 TextBox 控件。为使自己的工程能够正常工作,请把这些控件添加到工程中。1。建立到某个数据库的连接
1.> RDO
要打开一个连接,必须提供一个带参数的连接字符串。注意当 RDO 要创建一个 rdoQuery 对象时,是不需要连接的,但当最初创建一个 rdoResultset 对象时,则是需要的:
Dim cn As New rdoConnection
Dim cnB As New rdoConnection
Const ConnectionString = "uid=myname;pwd=mypw;driver={SQLServer}; _
server=myserver;database=pubs;dsn=''"
该连接字符串访问一个特定的 SQL Server,并允许 ODBC 在没有 DSN 的情况下打开一个连接。这是一个带有所有标准参数的典型 ODBC 连接字符串。
下一节代码,在窗体的 Load 事件中,建立了游标驱动程序的类型以及登录超时。缺省情况下,RDO 使用 rdUseIfNeeded 游标类型,该类型调用 SQL Server 上服务器端的游标。下面的示例中指定了 rdUseNone,从而使这种缺省规定不被遵守。rdDriverNoPrompt 标志意味着如果用户ID 和密码不匹配,应用程序将产生一个错误。
Private Sub Form_Load()
With cn
cn.Connect = ConnectString
cn.LoginTimeout = 10
cn.CursorDriver = rdUseNone
cn.EstablishConnection rdDriverNoPrompt
End With
第二个连接执行任何客户批处理更新:
With cnB
cnB.Connect = ConnectString
cnB.CursorDriver = rdUseClientBatch
cnB.EstablishConnection
End With
End Sub
当连接操作完成时最后一个事件发生,并且它能够对连接打开时所出现的任何错误进行处理。可以用该事件来测试连接是否正常工作,如果能正常工作,则使任何依赖于打开连接的按钮都成为有效的。
Private Sub cn_Connect(ByVal ErrorOccurred As Boolean)
If ErrorOccurred Then
MsgBox "Could not open connection", vbCritical
Else
RunOKFrame.Enabled = True
End If
End Sub
2.>ADO
要在 ADO 中建立一个数据库连接,首先创建一组可被 ADODB 对象引用的 ADO 对象。这些对象将在以后用于设置打开连接和generate结果集的特定属性:
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim cnB As New ADODB.Connection
Dim Qy As New ADODB.Command
下一行创建了一个连接字符串,正如您在前一个 RDO 示例中所创建的那样。在两种情况下,您都使用 ODBC 的 "非-DSN" 连接策略以节省时间,并提高性能:
Const ConnectionString = "uid=myname;pwd=mypw;driver={SQL Server}; _
server=myserver;database=pubs;dsn=",,connection=adConnectAsync"
下面的声明对本示例中用到的变量进行初始化。(注意一个保存结果集的变量数组的创建):
Dim sql As String
Dim rc As Integer
Dim i As Integer
Dim Changes As Integer
Dim bms() As Variant
下一步,打开一个到 Form_Load 事件中某个数据库的 ADO 连接。注意该代码和 RDO 代码是很相似的,只不过常数是以 "ad" 开始的,而不是 "rd"。如果要看到所有可以使用的常数,请查看 ADODB 类型库。
注意 不需要指定提示行为,因为 ADO 的缺省设置为"无提示"。不过,如果您选择对之进行更改,则可以使用 ADO Properties 集合来处理希望的提示行为。在 RDO 中,您可以用 OpenConnection 参数来设置行为。在 ADO 中,您必须设置 Properties ("Prompt") 属性。
同时,如果您不想使用游标驱动程序,则不必对其进行指定(象在 RDO 中的CursorDriver = rdUseNone),因为 ADO 的缺省规定是无游标驱动程序。
Private Sub Form_Load()
With cn
' 建立非 DSN 连接
.ConnectionString = ConnectString
.ConnectionTimeout = 10
'.Properties("Prompt") = adPromptNever
' This is the default prompting mode in ADO.
.Open
End With
With cnB
.ConnectionString = ConnectString
.CursorLocation = adUseClient
.Open
End With
End Sub
2。运行一个基本查询
1.>RDO
该事件过程返回一个基于 SQL 语句的结果集。它执行一个受限查询,并将结果集传递到一个控件,该控件将结果数据插入到某个 MSHFlexGrid 控件中。注意,建立结果集需要一个打开的连接。
Private Sub RunButton_Click()
Dim rs As rdoResultset
Set rs = cn.OpenResultset("select * from titles where title _
like '%h'")
rdoGrid1.ShowData rs
rs.Close
End Sub
2.>ADO
一旦打开了数据库连接,您就可以对其运行一个查询。下面的事件过程和先前的 RDO 代码是非常相似的。不过,在这种情况下,您用进行 SQL 查询的新 ADO Open 方法和 ADO Connection 对象作为参数,而不是使用 rdoConnection 对象的 OpenResultset 方法。您也可以选择使用 ADO Connection 对象的 Execute 方法,就象您可以在 RDO 中所做的那样(只要它不返回一个行集合)。
ADO2 和 RDO2 相比,一个主要的不同之处在于 ADO2 允许您创建一个记录集,并在打开该记录集之前对其属性进行设置。
Private Sub RunButton_Click()
Dim rs As New ADODB.Recordset
rs.Open "select * from titles where title like '%h'", cn
ADOGrid1.ShowData rs
rs.Close
End Sub
您可以运行该查询,并在 ADO 中异步地处理其结果集。也就是说,you specify the adFetchAsynch option on rs.Open,ADO 导致游标驱动程序自动充填背景中的结果集。
1.Open Client/Open Server C/S结构的中间件具体来说是配置在客户端和服务器端的软件包(注2::).Sybase Open Client/Open Server使分布式异构环境下的互操作成为可能.这里我们简述Sybase C/S 中间件的工作原理.Open Client 是客户端的API,它使客户端应用程序和第三方的工具软件把SQL语句和远程过程调用(RPC)通过网络发送给Sybase SQL Server,或经由Open Server应用(以利用Open Server开发为标志的应用)发送到其它的数据源(数据库系统或Objects Managents或普通的数据存储体)或其它类型的服务器.从Open Client API调用到信道传输有两种很重要的行为发生,TDS(同于Telnet、Ftp等属于应用层协议)格式化程序负责将上层的以API调用为标志的SQL或RPC等转化为TDS消息包而支持多种传输规程的网络库把TDS包按对应客户端与服务器端通信协议的封装格式化.自然在客户端,信道传输行为发生之前,同于其它的网络应用还有很多的行为(具体参看有关协议模型的资料).Open Server是服务器端的API,它允许客户机以SQL语句或RPC形式向一个非Sql Server数据源或其它类型的服务器发送请求.而后使该数据源或特殊服务器以标准的TDS格式向客户端送回状态和数据.Open Server可构成较为理想的C/S结构环境,即所有的客户端能按统一的方式与所有的服务器交互,而所有的服务器亦能按统一的方式接受客户端的请求,并以标准的格式向客户端返回结果.作为扩展,我们这里再介绍点关于Open Client/Open Server的知识,以便读者在下面详细探讨的ODBC体系分析中看到一些历史的技术因素.事实上,正如上面所述,Open Client/Open Server都是API,到Sybase System 11为止,成熟的API包含客户端的DB-Library、Client-Library和服务器端的Server-Library还有公共的CS-Library.重要的特性对比列举如下 1.Client-Library 优于 较老的DB-Library 而且Client-Library是与SQL无关的. 2.DB-Library 不支持服务器端的游标.Client-Library功能全面,支持所有类型的游标,包括敏感和不敏感游标 3.Open Server 是服务器端的API,用来开发服务器端应用.提供一致的数据访问框架能力.Open Server应用既可与Sybase通信又可与非Sybase通信而Sybase SQL Server 连接其它的数据源需要利用Open Server API开发Sybase Open GetWay. 这里稍微提一下,通过对Open Client/Open Server实现的功能、当时数据库系统服务特性、ODBC等较晚出现的接口体系、现时数据库系统服务特性的综合分析对比, 你会发现Open Client 应用(Open Client Application,包含Sybase Open GetWay、Normal DataSource Application、Mail Open Client 及其它的一些体现统一的数据访问框架的应用)在后来的数据接口体系中亦可实现同样功能但是实现的方式、功能的实现体及其分布大不相同.虽然到现时还有一些影子.
转帖:触发器设计技巧与实例在数据库设计中,有两种方法可设定自动化的资料处理规则,一种是条件约束,
一种是触发器,一般而言,条件约束比触发器较容易设定及维护,且执行效率较
好,但条件约束只能对资料进行简单的栏位检核,当涉及到多表操作等复杂操
作时,就要用到触发器了.
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别
是:
虚拟表Inserted 虚拟表Deleted在表记录新增时 存放新增的记录 不存储记录
修改时 存放用来更新的新记录 存放更新前的记录
删除时 不存储记录 存放被删除的记录
触发器的种类及触发时机
After触发器:触发时机在资料已变动完成后,它将对变动资料进行必要的
善后与处理,若发现有错误,则用事务回滚(Rollback Transaction)
将此次操作所更动的资料全部回复。
Istead of 触发器:触发时机在资料变动前发生,且资料如何变动取决于触发器现在介绍一下创建触发器的编写格式:After类型:
Create Trigger 触发器名称
on 表名
after 操作(insert,update)
as
Sql语句Instead类型
Create Trigger 触发器名称
on 表名
Instead of 操作(update,delete)
as
Sql语句实例1:
在订单(表orders)中的订购数量(列名为num)有变动时,触发器会先到客户(表Customer)中
取得该用户的信用等级(列名为Level),然后再到信用额度(Creit)中取出该等级
许可的订购数量上下限,最后比较订单中的订购数量是否符合限制。代码:
Create Trigger num_check
on orders
after insert,update
as
if update(num)
begin
if exists(select a.* from orders a join customer b on a.customerid=b.customerid
join creit c on b.level=c.level
where a.num between c.up and c.down)
begin
rollback transaction
exec master..xp_sendmail 'administrator','客户的订购数量不符合限制'
end
end
实例2:
有工资管理系统中,当公司对某员工甲的月薪进行调整时,通常会先在表员工中修改薪资列,然后在
表员工记录中修改薪资调整时间与薪资
Create trigger compensation
on 员工
after update
as
if @@rowcount=0 return
if update(薪资)
begin
insert 员工记录
select 员工遍号,薪资,getdate()
from inserted
end
什么是存储过程呢?定义: 将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊? Microsoft公司为什么还要添加这个技术呢?那么存储过程与一般的SQL语句有什么区别呢?存储过程的优点: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。 3.存储过程可以重复使用,可减少数据库开发人员的工作量 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类: 1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作, 如 sp_help就是取得指定对象的相关信息 2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能 exec master..xp_cmdshell 'ping 10.8.16.1' 3.用户自定义的存储过程,这是我们所指的存储过程 常用格式 Create procedure procedue_name [@parameter data_type][output] [with]{recompile|encryption} as sql_statement解释: output:表示此参数是可传回的with {recompile|encryption}recompile:表示每次执行此存储过程时都重新编译一次encryption:所创建的存储过程的内容会被加密如: 表book的内容如下 编号 书名 价格 001 C语言入门 $30 002 PowerBuilder报表开发 $52 实例1:查询表Book的内容的存储过程 create proc query_book as select * from book go exec query_book 实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额 Create proc insert_book @param1 char(10),@param2 varchar(20),@param3 money,@param4 money output with encryption ---------加密 as insert book(编号,书名,价格) Values(@param1,@param2,@param3)
select @param4=sum(价格) from book
go 执行例子:
declare @total_price money
exec insert_book '003','Delphi 控件开发指南',$100,@total_price
print '总金额为'+convert(varchar,@total_price)
go
存储过程的3种传回值:
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中 实例3:设有两个表为Product,Order,其表内容如下:
Product
产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中代码如下:
Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Product a inner join Order b on a.产品编号=b.产品编号
if @@error=0
print 'Good'
else
print 'Fail'
go