当前位置:首页 » 编程语言 » sqlexecute存储过程
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sqlexecute存储过程

发布时间: 2022-10-20 15:28:17

❶ cognos 可以调用oracle存储过程吗

存储过程调用描述
Cognos8.3 Report Studio设计动态报表,在前一节提到宏变量;本节是调用存储过程传递参数实现数据集返回,实时获取最新结果。对于特殊化的报表数据,不能用简单的sql脚本设计,考虑存储过程中使用游标输出。通过Framework Manager导入存储过程,再对机构约束限制,但数据权限控制有点麻烦。我可以在Report Studio设计一个汇总信息查询与用户信息表查询进行连接,到达数据访问控制。
报表设计时,重点是对业务逻辑熟悉程度,要点是业务需求梳理及数据组织技能高低。针对复杂报表实现方式很多,具体问题具体分析,寻找快捷有效的方案。
过程设计与调用
基于Oracle数据库,设计存储过程,返回一个结果集。
存储过程代码如下:
CREATE OR REPLACE PROCEDURE pro_stat_op_plc_anly(v_mon_id in integer,v_org_lvl in integer,
v_stat_list out SYS_REFCURSOR) IS
v_begin_date integer := v_mon_id * 100 + 1;v_end_date integer := v_mon_id * 100 + 31;Begin
open v_stat_list for
select b.org_lvl_nm,
b.org_lvl_sys,
b.parent_org_name,
b.parent_org_sys,
b.org_lvl_id,
b.lvl_name,
sum(a.acqu_ins_qty) as acqu_ins_qty,
sum(a.acqu_ins_prm) as acqu_ins_prm,
sum(a.acqu_ins_amnt) as acqu_ins_amnt,
sum(a.form_agg_tms) as form_agg_tms,
sum(a.stdpol_form_agg_tms) as stdpol_form_agg_tms,sum(a.stdpol_qty) as stdpol_qty,
sum(a.nudepol_qty) as nudepol_qty
from bidm.ta_op_plc a, gldmdb.v_d_org_lvl_4 bwhere a.internal_org_id = b.selling_org_idand b.sign_id = 2
and b.org_lvl_id = v_org_lvl
and a.cal_day_id between v_begin_date and v_end_dategroup by b.org_lvl_nm,
b.org_lvl_sys,
b.org_lvl_id,
b.lvl_name,
b.parent_org_name,
b.parent_org_sys
order by b.org_lvl_sys, b.org_lvl_id;
End;
在FM导入一个数据源,选择“Stored Procere”
指定一个过程名,点击“Finish”。
对新建的查询定义窗口,编辑输入参数“v_mon_id”、“v_org_lvl”。
修改数据类型为“nVarChar”,如果按照过程输入参数类型来设置,会出现报错。
增加两个变量,实现后端定义参数,前端调用:传入参数定义窗口在value处定义调用的变量。
Example - Use Prompts with a Stored ProcereIf you define prompts for stored procere variables, your users can set the variables in reports.
Steps
Create a stored procere query subject that uses the sp_FIND_ORDER_DATE stored procere.
The Query Subject Definition dialog box appears.
On the Definition tab, select the @order_number argument, and click the ellipsis (...) button.
In the Value box, type the following macro syntax and then click OK:
#prompt('Order Number','integer')#
Note: Framework Manager removes anything that is outside the number signs when running the macro.
If you want to test the prompt for the variable, do the following:
Click the Test tab, and then click Test Sample.
The Prompt Values dialog box appears.
In the Name column, click Order Number.
In the Value field, type 1234 and click OK.
One record is returned, showing the date for Order Number 1234.
Framework Manager uses this value for the ration of the current session or until you clear the prompt value.
Click OK.
点“Test”测试结果
输入两个参数,确认。结果如下:
导入的存储过程,类似于一个查询主题,自动装载输出结果字段名称。
Report Studio设计演示
发布到Web Server,用Report Studio设计一个带权限控制存储过程结果集,首先定义好权限控制用户信息查询,控制查询可以根据工号登录约束数据范围,关联字段是工号所属机构编码。再创建一个统计分析查询,记录事实数据信息。两个查询关联汇总到“汇总查询_FULL”查询。修改查询“处理”属性为“仅限本地”。
注意:关联时,“机构查询”与“统计分析”是1:1,或者是1:0通过自定义一个工号8888,限制只能查询4个分公司数据。如下:
利用存储过程实时动态查询结果,解决不能处理复杂的算法,如10%的计算指标;考虑ETL每天刷新数据的压力,缩短数据处理时间,但影响系统开销,用户查看报表占用数据库资源,多用户同时执行同一报表选择不同条件,对系统开销增大,设计时要考虑数据量与硬件性能。
===================================================以下是自己总结的cognos 在fm中创建 基于sp 的query subject 遇到的难题及解决办法===================================================问题描述:
做了个cognos报表,reportstudio做的,通过自定义sql(oracle环境)实现的,但是存在一个 亲和力问题,然后就打算把自定义sql改为存储过程,存储过程写好了,编译没问题,在 fm中 引入 sp数据源, 此时报错, RQP-DEF-0177 An error occurred while performing operation 'sqlExecute' status='-9'.
UDA-SQL-0107 A general exception has occurred ring the operation "execute".
ORA-06550: 第 1 行, 第 14 列:
PLS-00302: 必须说明 'PROC_XYK_MX_SHOP_TRAD' 组件ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
解决办法 :
把报表的数据源中的 schema属性设置的和原来的相反即可,例如:原来为空,那么就写上 用户名,原来不空,那么就置空,问题搞定.
分析原因:
在网上搜索了半天,不少类似的帖子,但是只有提出问题的,却没有一个给出准确答案的。有的说是oracle环境的问题,解决办法就是,最好能搭建一个能执行成功的环境,看看cognos自动生成的执行sql就好了。
PLS-00302: 必须说明 'PROC_XYK_MX_SHOP_TRAD' 组件,显然是数据库在调用这个'PROC_XYK_MX_SHOP_TRAD‘ 时没找到,为什么没找到呢,明明就在这个用户下,在sqlplus中调用也没问题,可能原因:cognos自动生成的sql不是多了用户名就是少了用户名,对于少了用户名还好理解,一个数据库多个用户,不指定用户名,它不知道是哪个用户下的,加上用户名(schema)自然就能找到了。对于多了用户名,这就难理解了。一般人不会出这样的错误,就是把用户名写错,更不可能把用户名写成 username.username样式,多了用户此时该这样理解:是执行的 username.sp 还是执行的 sp。 oracle环境不一样配置也不一样,一个简单验证的方式就是在 cognos administration中,添加这个数据库的数据源,并执行测试,如果测试不用输入用户名和密码就能测试成功,那么在fm中 数据源的 schema 应置空(不填写);如果测试需要输入用户名和密码才能测试成功,那么在fm中数据源的schema应写上用户名。

❷ 帮我把这条SQL语句改成在SQL里可用的存储过程

alter procere dbo.pager @OrderBy varchar(64) ,@orderType varchar (64) ,@Field varchar(64),@where varchar(256)
as
begin
declare @lssql nvarchar(1024)
set @lssql='select * from (select row_number() over(order by '+@OrderBy+' '+@OrderType+')
as rowNumber, '+@Field+' from Title where '+@where+')
as temp where rowNumber between (((1-1)*20)+1) and (1*20)'

select @lssql lssql ------获取sql语句 lssql
execute sp_executesql @lssql ------执行sql语句
end

execute pager 'AddTime','desc','*','Approve=''true'' ' ------执行存储过程,给每个变量赋值

❸ 通过组态王对数据库进行备份

不知你说的是哪种数据库的备份,组态王本身不提供数据库备份。如果需要,可以在关系数据库中配置备份功能,或者使用存储过程实现。组态王的SQL访问函数SQLSetStatement和SQLExecute配合使用可以调用关系数据库的存储过程,具体用法请参照关系数据库的存储过程使用。

❹ c#中连接数据库的类怎么写呀

我有一个,你试试
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.OleDb;
using System.Data;
using System.Data.SqlClient;

/// <summary>
///SqlConnDb类,适用于Sql数据库操作
/// </summary>
public class SqlConnDb
{
SqlConnection conn = null; //连接数据库的对象

/// <summary>
/// 构造函数,连接数据库,数据库连接字符在web.Config文件的AppSettings下的conStr
/// </summary>
public SqlConnDb()
{
if (conn == null)//判断连接是否为空
{
//string conString = "provider=sqloledb.1;data source=.;initial catalog=capucivar;user id=sa;pwd=";//连接数据库的字符串
string conString = System.Configuration.ConfigurationManager.AppSettings["conStr"];//连接数据库的字符串
conn = new SqlConnection(conString);

if (conn.State == ConnectionState.Closed)
{
conn.Open();//打开数据库连接

}
}
}

/// <summary>
/// 从数据库中查询数据的,返回为DataSet
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataSet query(string sql)
{
DataSet ds = new DataSet();//DataSet是表的集合

SqlDataAdapter da = new SqlDataAdapter(sql, conn);//从数据库中查询

da.Fill(ds);//将数据填充到DataSet

connClose();//关闭连接

return ds;//返回结果

}

/// <summary>
/// 更新数据库
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public int update(string sql)
{
SqlCommand oc = new SqlCommand();//表示要对数据源执行的SQL语句或存储过程

oc.CommandText = sql;//设置命令的文本

oc.CommandType = CommandType.Text;//设置命令的类型

oc.Connection = conn;//设置命令的连接

int x = oc.ExecuteNonQuery();//执行SQL语句

connClose();//关闭连接

return x; //返回一个影响行数

}

/// <summary>
/// 关闭数据库连接
/// </summary>
public void connClose()
{
if (conn.State == ConnectionState.Open)
{//判断数据库的连接状态,如果状态是打开的话就将它关闭

conn.Close();
}
}

}

/// <summary>
///OleDbConnDb类,适用于Accsee数据库操作
/// </summary>
public class OleDbConnDb
{
OleDbConnection conn = null; //连接数据库的对象

/// <summary>
/// 构造函数,连接数据库,数据库连接字符在web.Config文件的AppSettings下的conStr
/// </summary>
public OleDbConnDb()
{
if (conn == null)//判断连接是否为空
{
//string conString = "provider=sqloledb.1;data source=.;initial catalog=capucivar;user id=sa;pwd=";//连接数据库的字符串
string conString = System.Configuration.ConfigurationManager.AppSettings["conStr"];//连接数据库的字符串
conn = new OleDbConnection(conString);

if (conn.State == ConnectionState.Closed)
{
conn.Open();//打开数据库连接

}
}
}

/// <summary>
/// 从数据库中查询数据的,返回为DataSet
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataSet query(string sql)
{
DataSet ds = new DataSet();//DataSet是表的集合

OleDbDataAdapter da = new OleDbDataAdapter(sql, conn);//从数据库中查询

da.Fill(ds);//将数据填充到DataSet

connClose();//关闭连接

return ds;//返回结果

}

/// <summary>
/// 更新数据库
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public int update(string sql)
{
OleDbCommand oc = new OleDbCommand();//表示要对数据源执行的SQL语句或存储过程

oc.CommandText = sql;//设置命令的文本

oc.CommandType = CommandType.Text;//设置命令的类型

oc.Connection = conn;//设置命令的连接

int x = oc.ExecuteNonQuery();//执行SQL语句

connClose();//关闭连接

return x; //返回一个影响行数

}

/// <summary>
/// 关闭数据库连接
/// </summary>
public void connClose()
{
if (conn.State == ConnectionState.Open)
{//判断数据库的连接状态,如果状态是打开的话就将它关闭

conn.Close();
}
}

}

❺ VS中的方法调用问题

你没复制全吧,这是一个存储过程。能把全的补充一下吗?你的Function和EndFunction在哪里呢?

using(SqlXY.SqlExecuteXYsqlobj=newSqlXY.SqlExecuteXY()){

sqlobj.SqlExecuteNonQuery("
insertintoemp2(id,name,gender,birthdate,yeaofwork,phone,address)
values(newid(),@name,@gender,@birthdate,@yeaofwork,@phone,@address);",
newSqlParameter[]{
newSqlParameter("@name",name),
newSqlParameter("@gender",gender),
newSqlParameter("@birthdate",birthdate),
newSqlParameter("@yeaofwork",yeaofwork),
newSqlParameter("@phone",phone),
newSqlParameter("@address",address)
}//插入表EMP2,并且赋值,初始化实例
);
}

❻ sql中引用日期变量

declare@suffixvarchar(1000)
declare@sqlvarchar(2000)--这里定义了一个变量
select@suffix=CONVERT(varchar(100),GETDATE(),112)
set@sql='select*fromtest_'+@suffix+''--需要指定动态sql
exec(@sql)--这句是执行

❼ 存储过程在数据库中的作用是什么

第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。

第二:存储过程可接受参数、输出参数、返回单个或多个结果集及返回值。向程序返回错误原因。

第三:存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。

第四:存储过程主要是在服务器上运行,减少对客户机的压力。

第五:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏数据逻辑。

第六:存储过程可以在单个存储过程中执行一系列SQL语句。

第七:存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

(7)sqlexecute存储过程扩展阅读:

存储过程的优点:

1、存储过程的能力大大增强了SQL语言的功能和灵活性。

2、可保证数据的安全性和完整性。

3、通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

4、通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。

5、在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。

6、可以降低网络的通信量。

7、使体现企业规则的运算程序放入数据库服务器中,以便集中控制。

❽ 用VB6.0做程序,遇到问题求解

使用一个字符串,再执行SQL。
参考帮助

运行动作查询或执行 SQL 语句,它们都不返回行。

语法

connection.Execute source[, options]

query.Execute [options]

Execute 方法的语法有下列部分:

部分
描述

connection
对象表达式,其值是查询将运行的 rdoConnection 对象。

query
为 rdoQuery 对象求值的对象表达式,其中
rdoQuery 对象的 SQL 属性设置为指定的 SQL 语句将要执行。

source
字符串表达式,含有要执行的动作查询或 rdoQuery 的名字。

options
Variant
或常数,确定查询如何运行,设置值如下面所述。

设置值

可以为 options
参数可使用下列常数:

常数

描述

rdAsyncEnable
32
异步地执行操作。

rdExecDirect
64
(缺省)不创建保存过程而执行查询。使用 SQLExecDirect 代替 SQLPrepare 和
SQLExecute。

说明

推荐只对动作查询使用 Execute 方法。因为动作查询不返回任何行,所以
Execute 不返回 rdoResultse。可以对执行多语句的查询使用 Execute
方法,这些批语句都不能返回行。为了执行组合操作和 SELECT 查询的多结果集查询,使用 OpenResultset 方法。

使用 rdoConnection 或 rdoQuery 对象的
RowsAffected 属性,确定受最新 Execute 方法影响的行数。RowsAffected
含有当执行动作查询时所删除的、更新的、或插入的行数。当使用 Execute 方法运行一个 rdoQuery 时,该
rdoQuery 对象的 RowsAffected 属性就被设为受影响的行数。

选项

为了异步地执行查询,可使用 rdAsyncEnable 选项(它被缺省设置)。如果设置了该选项,数据源查询处理器立即开始查询,且在该查询完成之前就返回应用程序。使用
StillExecuting 属性确定查询处理器何时准备从查询返回结果。使用 Cancel
方法中止异步查询的处理。

为了不建立临时的保存过程就执行查询,使用 rdExecDirect
选项。当查询含有对事务、或对只存在于单个操作的上下文的临时表的引用时,需要这个选项。例如,如果查询或引用临时表中含有 Begin Transaction
TSQL 语句,则必须使用 rdExecDirect 以确保当结束查询挂起这些对象时,远程引擎不拒绝。

建议不要使用 Execute
方法执行保存过程,因为过程的返回值及输出参数会被,并且过程也不能返回行。对 rdoQuery 使用 OpenResultset
方法执行存储过程。

注意 当执行不需要参数的保存过程时,不要在 SQL 语句中包含括号。例如,执行 "MySP"
过程,使用下列语法:{ Call MySP }。

同样,与下列类似的调用:
rCn.Execute SqlStatement, rdAsyncEnable +
rdExecDirect

仅允许一个未完成请求并允许 Visual Basic 代码与 SQL Server 过程重叠,但是不允许多个未完成 SQL
Server 请求。

❾ 请高手进来帮忙,关于SQL和网络通信链接失败的问题,追加50分。

VB访问SQL Server数据库技术全揭密

摘 要:

本文讨论了Visual Basic应用程序访问SQL Server数据库的几种常用的方法,分别说明了每种方法的内部机理并给出了每种方法的一个简单的实例,最后比较了每种方法性能和优缺点。

一、引言

SQL Server是微软推出的中小型网络数据库系统,是目前最常用的数据库系统之一。随着SQL Server网络数据库应用程序日益增多,这种Web数据库应用系统的正常运行一般依赖于已存在的用户数据库。创建维护数据库的工作可用SQL Server提供的SQL Enterprise Manager工具来进行,如能提供一种定制的数据库管理工具,通过管理应用程序来管理数据库及其设备,对用户来说无疑是最理想的。

Visual Basic作为一种面向对象的可视化编程工具,具有简单易学,灵活方便和易于扩充的特点。而且Microsoft为其提供了与SQL Server通信的API函数集及工具集,因此它越来越多地用作大型公司数据和客户机—服务器应用程序的前端,与后端的Microsoft SQL Server相结合,VB能够提供一个高性能的客户机—服务器方案。

二、VB访问SQL Server数据的常用方法

使用Visual Basic作为前端开发语言,与SQL Server接口有几种常用的方法,即:

①数据访问对象/Jet

②为ODBC API编程

③使用SQL Server的Visual Basic库(VBSQL)为DB库的API编程

④RDO 远程数据对象(RemoteData Objects)

⑤ADO 数据对象(Active Data Objects)

1、数据访问对象/Jet

VB支持Data Access Objects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机—服务器之间的对话方式,但它的确有许多优点。DAO/Jet是为了实现从VB访问Access数据库而开发的程序接口对象。使用DAOs访问SQL Server的过程如下:应用程序准备好语句并送至Jet,Jet引擎(MASJT200.DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBC.DLL)通过调用驱动器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译并向SQL Server提交SQL语句且返回结果。下面是一个用DAOs访问SQL Server的VB实例。

注释:Form Declarations

Dim mydb As Database

Dim mydynaset As Dynaset オ

Private Sub Form_Load()

Set mydb = OpenDatabase("", False, False, "ODBC; DSN=Myserver; WSID=LCL; DATABASE = sales")

Set mydynaset = mydb CreateDynaset("Select*from Customers") オ

End Sub ァ

上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。OpenDatabase函数的最后一个参数是ODBC连接字符串参数,它指明了Microsoft Access连接到SQL Server所需要知道的一些内容。其中“DSN”为数据源名,“WSID”为工作站名,“DATABASE”为所要访问的数据库名。

2、利用ODBC API编程

ODBC(Open Database Connectivity)的思想是访问异种数据库的一种可移植的方式。与数据资源对话的公用函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。应用程序调用驱动程序管理器中的函数,而驱动程序管理器反过来通过驱动器(SQLSRVR.DLL)把它们送到服务器中。

下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句句柄。

Global giHEnv As Long

Global giHDB As Long

Global giHStmt As Long

Dim myResult As integer

Dim myConnection As Srting

Dim myBuff As String*256

Dim myBufflen As Integer

If SQLAllocEnv(giHEnv)<>SQL_SUCCESS Then

MsgBox"Allocation couldn注释:t happen!"

End If

If SQLAllocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then

MsgBox "SQL Server couldn注释:t connect!"

End If

myConnection="DSN=myServer;UID=LCL;PWD=;APP=ODBCTest;WSID=LCL;DATABASE=sales"

myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQU IE D)

myResult=SQLAllocStmt(giHDS,giHStmt)

myResult=SQLFreeStmt(giHStmt,SQL_COLSE)

rsSQL="Select * from Customers Where City = "Hunan""

myResult = SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))

3、使用VBSQL对DB库API编程

DB库是SQL Server的本地API,SQL Server的Visual Basic库(VBSQL)为Visual Basic程序员提供API。从一定意义上说,VBSQL是连接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下三个文件:

VBSQL.VBX: 包含库函数,具有访问重要的消息和处理错误的能力

VBSQL.BI:包括所有的常量和变量说明

VBSQL.HLP:Windows帮助文件,使用VBSQL的指南

使用VBSQL时,必须将VBSQL.BI加入到Visual Basic工程文件中,并确保VB程序运行时有VBSQL.VBX文件。

一般的DB库API编程的过程是这样的:先通过调用SqlInit对DB库进行初始化,再调用SqlConnection打开一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并登录到服务器的通用例程。
Private Sub InitializeApplication()
DBLIB_VERSION=SqlInit()

If DBLIB_VERSION=""Then

MsgBox"Could not initialize DBLIB!Exit application.", MB_ICONEXCLAMATION

End If

End Sub

Private Function LoginToServer() As integer

loginToServer=SUCCEED

Status%=SqlSetloginTime%(loginTimeOut)

If giSqlConn<>0 Then

SqlClose(giSqlConn) 注释:关闭已打开的连接

giSqlConn=SqlOpenConnection(gsServerName, gsLoginID, gsPassword, ProgramName, ProgramName)

If giSqlConn<>0 Then

liresuit=SqlUse(giSqlConn,"Sales")

Else

LogintoServer=FAIL

End If

End Function

4、RDO 远程数据对象(RemoteData Objects)

要讨论RDO,就必然要谈到DAO。RDO是从DAO派生出来的,但两者很大的不同在于其数据库模式。DAO是针对[记录(Records)]和[字段( Fields)],而RDO是作为[行(Rows)]和[列(Columns)]来处理。也就是说DAO 是ISAM模式,RDO是关系模式。此外DAO是访问Access的Jet引擎(Jet是ISAM)的接口,而RDO则是访问ODBC的接口。

可见,RDO是综合了DAO/Jet、VBSQL/DBLib以及ODBC的优点的对象(Object)。需要强调的是,RDO是包裹着ODBC API的一层薄薄的外壳, 被设计成在后台(服务器端)有数据库存在的前提下运行,同时也是针对SQL Server和Oracle而特别设计的。

RDO的优势在于它完全被集成在VB之中。此外,直接访问SQL Server存储过程、完全支持T-SQL、T-SQL调试集成在开发环境中、Visual Database Tools的集成化等,也是RDO的长处。

在RDO的对象和集合中,有很多对数据库的状态和设定进行操作的属性(Property),以及对数据库进行操作的方法(Method)。利用这些,从RDO2.0起就可以开发事件驱动的数据库应用程序。

RDO对象与VB中其他对象的概念相同。与VB用的ActiveX控件(以往称为Custom Control或OCX、VBX)相似的是,RDO也带有属性和方法;但同Spread、InputMan等普遍应用的ActiveX控件不同的是,RDO没有自己的用户界面,因而可以和VB标准的Timer控件归为同一类。当然也可以将RDO看作调用ODBC API函数,进而对后台数据库操作加以控制的对象。在RDO的属性和方法中,包含了对单个的ODBC API函数以及一连串API函数的调用。

①rdoEngine对象

最初调用RDO对象以及RDC(远程数据控件)时,自动生成rdoEngine对象的附带事件(incident)。rdoEngine用于对RDO全局属性的参数、选项进行设置,是在RDO的阶层结构内处于最上层的对象,包含了所有的其他对象。

rdoEngine对象与DAO/Jet不同,虽然被多个应用程序共享,但体现rdoEngine对象的设定值的属性却并不共用,而是在各自的应用程序的程序界面中对其分别加以设定。这些设定值对其他使用RDO以及RDC的应用程序没有任何影响。rdoEngine不是集合的要素,而是重新定义的对象,rdoEngine对象不能被追加作成对象属性的初值。

②rdoEnvironment对象

RDO对象在自动创建rdoEngine对象时,将rdoEnviroment对象的初始值生成并保存为rdoEnviroments(0)。一般情况下,应用程序中不必追加rdoEnvironment对象,大多只需对已有的rdoEnviroments(0)进行操作就可以了。只有在支持一个以上事务(Transaction),需要将用户名和口令信息分别处理的情况下,利用rdoCreateEnvironment方法将特定的用户名和口令值做成新的rdoEnvironment对象。在这个方法中可以指定固有名、用户名和口令,如果所指定的值与rdoEnvironments集合的已经存在的成员名称相同,会产生错误。新建的rdoEnvironment对象自动追加在rdoEnvironments集合的最后。调rdoCreateEnvironment方法时,其name参数可以是长度为0的文字列,这时新的rdoEnvironment对象将不会被追加在rdoEnvironments集合之中。

③rdoConnection对象

rdoConnection对象用于同SQL Server的连接管理。

下面是与SQL Server连接的例子。

用OpenConnection方法的一个实例。

设定的DSN为MyDSN:

Dim Cn As rdoConnection

Dim En As rdoEnvironment

Dim Conn As String

Conn = "DSN = MyDSN; UID = Jacob;" & "PWD = 123456; DATA BASE = MyDb;"

Set Cn= En.OpenConnection("", rdDriverPrompt, False, Co nn)

Set Cn= En.OpenConnection(Prompt:= rdDriverPrompt, Rea dOnly:= False,Connect:= Cnn)

用EstablishConnection方法的一个实例。

这里以独立的rdoConnection对象为例说明与SQL Server的连接。

Public WithEvents Eng As rdoEngine

Public WithEvents Cn As rdoConnection

Private Sub Form_Load()

Set Eng = New rdoEngine

Set Cn = New rdoConnection

With Cn

.Connect = "UID = ; PWD = ;" & "DATABASE = pubs; DSN = biblio"

.LoginTimeout = 5

.EstablishConnection rdoDriverNoPromt, True, rdAsyncEna ble

End With

End Sub

在这个例子中,Form_Load函数对rdoEngine和rdoConnection对象进行初始化。这里有一点需要注意,rdoConnection对象是处于独立的状态之下,即使是处于未连接状态也可以设置属性的值。接下来是rdoConnect对象的事件处理程序。从RDO 2.0起可以实现异步方式(rdAsyn cEnable),EstablishConnection就设定为该值。在异步状态下,不必等待与数据库的连接,程序可以迅速从Form_Load 函数中退出。 然后是BeforeConnect事件,该处理在与数据库的连接开始以前被激发,此时不能进行有关终止连接的操作:

Private Sub Cn_BeforeConnect(ConnetString As String, Pro mpt As Variant)

MsgBox "正在连接" & ConnectString, vbOKOnly, "连接前"

End Sub

连接完成之后的事件处理:
Private Sub Cn_Connect(ByVal ErrorOccurred As Boolean)

Dim M As String

If ErrorOccurred Then

For Each er In rdoErrors

M = M & er & vbCrLf & M

Next

MsgBox "连接失败" & vbCrLf & M

Else

MsgBox "连接成功"

注释:这是确认连接状态的测试代码

Cn.Excute "use pubs"

End Sub

RDO连接处理结束后,在该事件中确认连接成功与否。连接成功的情况下ErrorOccurred返回False,失败时为True,由此可以对rdoErrors集合进行检测:

Private Sub Eng_InfoMessage()

For Each er In rdoErrors

Debug.Print er

Next

RdoErrors.Clear

End Sub

不能与SQL Server连接的原因多种多样,有可能是由于对数据库的访问权限、网络连接问题、数据库表的信息错误、SQL Server同时连接的许可数、资源不足等等,具体情况需要与网络管理员商量。 断开连接的操作非常简单,但又很重要,因为RDO不提供自动断开的功能。

Cn.Close

Set Cn = Nothing 注释:释放对象所占的内存资源

En.Close

Set En = Nothing 注释:释放对象所占的内存资源

VB是对象语言,Form、ActiveX控件也都是对象。使用对象后必须养成将对象设为Nothing把它从内存中释放的编程习惯。这样可以预防很多不可预测错误,往往程序中发生原因不明的错误时,其原因就在于此。

5、ADO 数据对象(Active Data Objects)

ADO是基于全新的OLE DB技术,OLE DB可对电子邮件、文本文件、复合文件、数据表等各种各样的数据通过统一的接口进行存取。随着ActiveX控件的升级(Windows 98的ActiveX 5.0),RDO将被以ActiveX技术为基础的ADO接口所替代。下面将介绍基于ActiveX技术的ADO访问SQL Server 6.5数据库的技术和方法。基于浏览器的ADO接口常用函数如下:

(1)取当前的工作数据库

由于管理任务一般都必须在Master库中完成,因此在执行管理任务之前,最好保存当前工作库,以便完成任务之后再切换回原来的任务。

Public Function SQLGetCurrentDatabaseName(Cn As ADODB.Connection) As String

Dim sSQL As String

Dim RS As New ADODB.Recordset

On Error GoTo errSQLGetCurrentDatabaseName

sSQL="select CurrentDB=DB_NAME ( )"

RS.Open sSQL, Cn

SQLGetCurrentDatabaseName=Trim $ (RS! CurrentDB)

RS.Close

Exit Function

errSQLGetCurrentDatabaseName:

SQLGetCurrentDatabaseName=" "

End Function

(2)取SQL Server安装目录下的DATA子目录路径

取SQL Server的设备文件缺省目录,返回如D:MSSQL DATA。

Public Function SQLGetDataPath(Cn As ADODB.Connection) As String

Dim sSQL As String

Dim RS As New ADODB.Recordset

Dim sFullPath As String

On Error GoTo errSQLGetDataPath

sSQL="select phyname from master..sysdevices where name=注释:master注释: "

RS.Open sSQL, Cn

sFullPath = RS! phyname

RS.Close

SQLGetDataPath=Left $ (sFullPath, Len(sFullPath) -10) 注释:MASTER.DAT的大小

Exit Function

errSQLGetDataPath:

SQLGetDataPath=" "

End Function

(3)创建一个新数据库

Public Function SQLCreateDatabase65 (Cn As ADODB.Connection,sDBName As String, sDataDeviceName As String, nDataSize As Integer, Optional sLogDeviceName, Optional nLogSize) As Boolean

Dim sSQL As String

On Error GoTo errSQLCreateDatabase65

Dim sDB As String

sDB =SQLGetCurrentDatabaseName(Cn)

sSQL = "USE master"

Cn.Execute sSQL

sSQL ="CREATE DATABASE" & sDBName

sSQL = sSQL &" ON " & sDataDeviceName & "=" & nDataSize

If Not IsMissing(sLogDeviceName) And Not IsMissing(nLogSize) Then

sSQL = sSQL & "LOG ON" & sLogDeviceName & "="& nLogSize

End If

Cn.Execute sSQL

sSQL = "USE" & sDB

Cn.Execute sSQL

SQLCreateDatabase65 = True

Exit Function

errSQLCreateDatabase65:

On Error Resume Next

sSQL = "USE " & sDB

Cn.Execute sSQL

SQLCreateDatabase65 = False

End Function

(4)判断一个数据库是否存在

Public Function SQLExistDatabase(Cn As ADODB.Connection, sDBName As String) As Boolean
Dim sSQL As String

Dim RS As New ADODB.Recordset

Dim bTmp As Boolean

on Error GoTo errSQLExistDatabase

sSQL = "select CntDB = count ( * ) "

sSQL = sSQL & "From master.dbo.sysdatabases"

sSQL = sSQL & "Where name = 注释: "& sDBName & " 注释: "

RS.Open sSQL, Cn

If RS! CntDB = 0 Then bTmp = False Else bTmp = True

RS.Close

SQLExistDatabase = bTmp

Exit Function

errSQLExistDatabase:

SQLExistDatabase = False

Exit Function

End Function

(5)删除一个数据库

Public Function SQLDropDatabase (Cn As ADODB.Connection, sDBName As String) As Boolean

Dim sSQL As String

On Error GoTo errSQLDropDatabase

If Not SQLExistDatabase(Cn, sDBName) Then

SQLDropDatabase = True

Exit Function

End If

Dim sDB As String

sDB = SQLGetCurrentDatabaseName(Cn)

sSQL = "Use master"

Cn.Execute sSQL

sSQL = "DROP DATABASE " & sDBName

Cn.Execute sSQL

sSQL = "USE " & sDB

Cn.Execute sSQL

SQLDropDatabase = True

Exit Function

errSQLDropDatabase:

On Error Resume Next

sSQL = "USE " & sDB

Cn.Execute sSQL

SQLDropDatabase = False

End Function

三、性能比较及应用说明

用VB开发基于SQL Server的数据库系统,以上几种访问SQL Server的方法各有各的特点。DAOs方法是基于对象的,因而便于使用,但是它是从Visual Basic到SQL Server最慢的连接方式。ODBC API和VBSQL方法从本质上讲是基于程序的。ODBC API方法通用性好,允许最强的互操作性,编程简单,但速度慢于VBSQL方法。VBSQL方法通过VBSQL控件,提供了重要的SQL Server前端应用程序所需的灵活性、强大功能和良好性能。它具有真正的事件驱动及错误处理能力,完全支持异步处理、游标和计算列等。这些都是VBSQL方法超出其它方法的优势,但其编程稍复杂。RDO是位于ODBC API之上的一个对象模型层,它依赖ODBC API、ODBC驱动程序以及后端数据库引擎来实现,用RDO所需的程序短小(约250 KB)、快速。RDO具备基本的ODBC处理方法,可直接执行大多数ODBC API函数,RDO包含在VB 4.0/VB 5.0企业版中,由MSRDO32.DLL动态连接库来实现。RDO是综合了DAO/Jet、VBSQL/DBLib和ODBC的优点的对象模型,包含ODBC API应用层,设计为在后台(服务器端)有数据库存在的前提下运行,是针对SQL Server和Oracle而特别设计的。RDO的优势在于它完全被集成在VB之中,可直接访问SQL Server存储过程、完全支持T-SQL、T-SQL调试集成在开发环境中、Visual Database Tools的集成化等。但微软已宣布今后不再对VBSQL/DBLib进行升级,而ODBC API函数一般的编程方式也不为人们所喜爱,RDO的应用将逐渐减少。至于实际使用哪一种接口方式,在很大程度上依赖于用户的应用程序的具体情况而定。

四、VisualBasic访问数据库的前景

近来随着Web应用软件的迅速发展和现有数据存储形式的多种多样,Visual Basic访问数据库的解决方案面临诸如快速提取分布于企业内部和外部有用商业信息等的多种挑战。为此Microsoft提出一种新的数据库访问策略,即“统一数据访问”(UniversalDataAccess)的策略。“统一数据访问”提供了高性能的存取包括关系型和非关系型在内的多种数据源,提供独立于开发工具和开发语言的简单的编程接口,这些技术使得企业集成多种数据源、选择更好的开发工具、应用软件、操作平台、建立容易维护的解决方案成为可能。

“统一数据访问”的基础是Microsoft的数据访问组件。这些组件包括ActiveXDataObjects(ADO)、RemoteDataService(RDS,也称“高级数据连接器或”ADC)、OLEDB和ODBC。