配置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的核心文件。

解决方案 »

  1.   

    数据库访问技术
    通过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数据源。
      

  2.   

    ADO 和 RDO、DAO 当前Microsoft 的最新数据访问技术 ActiveX Data Objects (ADO) 非常流行。ADO 是以前的 DAO、尤其是 RDO 数据访问接口的一个替代,它提供了前两者都不具备的附加功能。本文主要讨论如何把正使用 RDO 进行的数据访问虑移植到 ADO 上,以便大家使用 ADO 转换自己的应用程序。
      

  3.   

    一、ADO 和 RDO、DAO 的比较ADO 并不是自动和您现存的数据访问应用程序代码兼容的。当 ADO 封装 DAO 和 RDO 的功能性的时候,就必须将许多语言要素转换为 ADO 语法。在某些情况下,您可以将现存代码的某些功能做一个简单转换。在其他情况下,最好是用 ADO 的新功能重写该应用程序。DAO (Data Access Objects) 数据访问对象是第一个面向对象的接口,它显露了 Microsoft Jet 数据库引擎(由 Microsoft Access 所使用),并允许 Visual Basic 开发者通过 ODBC 象直接连接到其他数据库一样,直接连接到 Access 表。DAO 最适用于单系统应用程序或小范围本地分布使用。RDO (Remote Data Objects) 远程数据对象是一个到 ODBC 的、面向对象的数据访问接口,它同易于使用的 DAO style组合在一起,提供了一个接口,形式上展示出所有 ODBC 的底层功能和灵活性。尽管 RDO 在很好地访问 Jet 或 ISAM 数据库方面受到限制,而且它只能通过现存的 ODBC 驱动程序来访问关系数据库。但是,RDO 已被证明是许多 SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO 提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。ADO 是 DAO/RDO 的后继产物。ADO 2.0在功能上与 RDO 更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO "扩展"了 DAO 和 RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。例如,ADO 没有与 rdoEngine 和 rdoEnvironment 对象相等同的对象,可以显露 ODBC 驱动程序管理器和 hEnv 接口。虽然您的接口可能是通过 ODBC OLE DB 服务提供程序实现的,但您当前也不能从 ADO 中创建 ODBC 数据源。包含在 DAO 和 RDO 模型中的许多功能被合并为单个对象,这样就生成了一个简单得多的对象模型。然而,由于这个原因,起初您可能会觉得找到合适的 ADO 对象、集合、属性、方法,或事件非常困难。与 DAO 和 RDO不同的是,虽然 ADO 对象是分层结构的,但在分层结构范围之外也是可以创建的。不过,也应当注意,ADO 当前并不支持 DAO 的所有功能。ADO 主要包括 RDO 风格的功能性,以便和 OLE DB 数据源交互,另外还包括远程和 DHTML 技术。一般说来,在 ADO 的演化过程中,马上把大多数 DAO 应用程序移植到 ADO 上可能为时太早,因为当前的 ADO 并不支持数据定义 (DDL)、用户、组,等等。不过,如果您只将 DAO 用于客户-服务器应用程序,而并不依赖于 Jet 数据库引擎或不使用 DDL,那么现在就可能移植到 ADO。最终,Microsoft 将提供一个 ADO DDL 部件来帮助进行 DAO 到 ADO 的移植,并为 OLE DB 供应商提供一般的 DDL 支持。
      

  4.   

    二、ADO 2.0 对象模型ADO 2.0 对象模型由八个对象组成的,它们中的大多数在功能上和 RDO 对象相似,只不过具有更强的功能性而已。需要花一些时间在 Object Browser (F2) 中浏览对象模型,以便于熟悉各种不同属性、方法、事件、集合等等所在的位置。
    注意 所有后面带有星号 (*) 的对象都是同时应用于 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 对象。 
      

  5.   

    三、一般数据访问的移植下面列出了两个基本的数据访问方案,每个方案都在后面的主题中进行了讨论。在每种方案中,都介绍了一种 RDO 解决方案和一种 ADO 解决方案。 
    · 建立到某个数据库的连接
    · 运行一个基本查询注意 部分示例引用了某个窗体上的附加控件,例如一个 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 导致游标驱动程序自动充填背景中的结果集。
      

  6.   

    呵呵,谁能提供ado2.7的中文帮助?
      

  7.   

    谁能提供ado2.7的中文帮助???
      

  8.   

    数据访问接口体系探讨(转)
    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 及其它的一些体现统一的数据访问框架的应用)在后来的数据接口体系中亦可实现同样功能但是实现的方式、功能的实现体及其分布大不相同.虽然到现时还有一些影子. 
      

  9.   

    2.ODBC(Open DataBase Connectivity : 开放数据库连接) ODBC是Microsoft Windows Open Standards Architecture (WOSA,Windows开放服务体系)的重要组成部分,由Microsoft公司于1991年底发布,短短几年已成为事实上的工业标准.它建立了一组规范,提供了一套分层(随着层的扩展,数据服务能力不断的增强)的标准API(支持SQL),它解决了嵌入式SQL接口的非规范核心,数据应用系统用它来访问任何提供了ODBC驱动程序(一组DLL)的数据库,结束了过去针对不同的数据库系统开发须掌握相应数据访问API的时代.事实上,可将ODBC体系看作统一的数据访问界面,而使这种统一的数据访问成为可能的就是各数据库产品厂商提供的相应的ODBC Provider(ODBC提供者即ODBC 驱动),但ODBC一般只能用于关系数据库,很难访问对象数据库或其它非关系数据库或数据系统.下面简述ODBC体系的组成和工作原理. ODBC规范阐释,ODBC体系有四个组成部分:Application、Driver Manager、Driver、Data Source.(如下图).     结合现实的高层开发工作流程如下:         1.数据应用系统首先获得在ODBC数据源管理器中建立的DSN(存储了与数据提供程序连接的详细信息包含数据库位置、数据库类型及相应的ODBC驱动程序等),然后 Driver Manager依赖一种叫做数据库独立的交流(Database Indepedent Communications Technology)的技术与数据源建立联系(其中涉及客户端和服务器端多种Agent对象的问题,详情不叙,可参见下图).         2.Driver Mangaer调用特定ODBC驱动程序将ODBC标准API转化为适用于具体数据库系统的函数调用(数据库特征不同之处也在这里翻译如SQL语法差异等),然后经由客户端的Request Agent发送到数据源.        3.数据源Database Agent处理操作,将结果返回到客户端的Request Agent,再向上经Driver(这里会有翻译和标准化错误码的行为)、Driver Mangaer返回给Application.       需要说明的是定义和操作光标、维护事务、负责任何与访问数据源的必要软件层进行交互(包括与底层网络或文件系统接口的软件)等行为亦由驱动程序完成.      结合ODBC API调用顺序描叙工作流程:初始化(分配环境--->分配连接句柄--->与服务器连接--->分配语句句柄)-------->SQL处理(语句处理和检索部分)-------->终止(释放语句句柄--->与服务器断开--->释放连接句柄--->释放环境).
      

  10.   

    3.OLE DB(Object Link and Embedding DataBase)   随着网络技术和数据库技术的不断发展,现在的应用系统对数据集成的要求越来越高.有必要将不同的地方,不同的格式(如关系型数据库和操作 系统中的文件、电子表格、电子邮件、多媒体数据以及目录服务信息或主机系统中的IMS和VSAM数据等等)的数据集成.传统的解决方案是使用大型的数据库系统,把所有这些数据都移到数据库系统中,然后按照操作数据库的办法对这些数据进行访问,这样做虽然能够按统一的方式对数据进行各种操作,这种间接访问方式带来了很多问题,比如数据更新不及时、空间资源的冗余和访问效率低等等   此时Microsoft公司的通用数据访问技术(UDA)应运而生,它使数据应用系统能通过实现标准OLE DB接口的数据提供者来访问各种各样的数据,而不管数据驻留在何处,也不需要进行数据转移或复制、转换.    OLE DB作为一种数据访问接口体系,体现了Microsoft的通用数据访问(UDA)策略的理念.UDA能够通过标准接口来访问各种类型的数据.同于ODBC体系它也提供了一套标准API,不过OLE DB API是完全基于COM的,其特点是采用了多层模型.在COM通信层的一侧是数据另一侧则是数据使用者.这种基于COM的通信可被概括为在抽象对象(如DataSource、Session、Command 和 Rowset)上执行的操作.因此,当使用者连接到DataSource,打开 Session,发出Command,并返回数据Rowset时,便会出现这种情况.    事实上,OLE DB是系统级的编程接口,它定义了一组COM接口,这组接口封装了各种数据系统的访问操作,这组接口为数据使用者和数据提供者建立了标准,OLE DB还提供了一组标准的服务组件,用于提供查询、缓存、数据更新、事务处理等操作,因此数据提供方只需实现一些简单的数据操作.在使用方就可以获得全部的数据控制能力. 
      

  11.   

    干脆把好东西收藏在一起好了!
    转帖:触发器设计技巧与实例在数据库设计中,有两种方法可设定自动化的资料处理规则,一种是条件约束,
    一种是触发器,一般而言,条件约束比触发器较容易设定及维护,且执行效率较
    好,但条件约束只能对资料进行简单的栏位检核,当涉及到多表操作等复杂操
    作时,就要用到触发器了.
          一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别
     是:
                     虚拟表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 
      

  12.   

    转帖:存储过程入门与提高 
    什么是存储过程呢?定义:      将常用的或很复杂的工作,预先用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