當前位置:首頁 » 編程語言 » 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。