PB與各種數據庫連接!!
1.Power script 語言里的事務處理對象怎么理解
PowerBuilder
程序與數據庫之間傳遞信息的一個結構變量,共有15個成員.你可以詳細列表它的所有成員看看它的組成,PB的應用程序會初始化一個全局的結構體變量,SQLCA,當然你也可以自定義一個自己的事務對象.
1 DBMS string 所使用的數據庫管理系統的名字,如Sybase,Oracle,ODBC。
2 Database string 要連接的數據庫名字。
3 UserID string 連接數據庫所用的用戶名。有的DBMS不需要此項。
4 DBPass string 用戶連接數據庫的口令。
5 Lock string 這是數據庫的保護級別,一般不必給出。
6 LogID string 登錄到數據庫服務器上的用戶名,有的DBMS不需要此項,但Sybase和Oracle需要指定這個參數。
7 LogPass string 登錄到數據庫服務器上的用戶口令。這個屬性可設可不設,但Sybase和Oracle需要指定口令。
8 ServerName string 數據庫服務器名。
9 AutoCommit boolean
指定是否將數據庫設置成自動提交所有事務。默認是False,也就是說,必須在應用程序中進行事務管理,並在適當的時候對數據庫提交事務。如果選擇True,則每個事務都由系統自動提交。
10 DBParm string 用於向數據庫傳遞特殊信息的屬性。
11 SQLCode long 指示最近一次SQL操作失敗或成功。它的取值為: 返回結果 0 無錯誤。 -1 出現一個錯誤。 100
沒有檢索到數據。
12 SQLNRows long 最近一次SQL操作影響的行數,數據庫不同其含義也不同。
13 SQLDBCode long 數據庫錯誤代碼。不同的數據庫的含義不同。
14 SQLErrText string 相應於SQLDBCode屬性中錯誤碼的文字說明。
15 SQLReturnData string 返回DBMS執行SQL的附加信息,不同的DBMS其值不同。
2.我常見到做好的PB程序使用.ini文件來控制與數據庫連接,可以方便的進行應用程序移植只需修改其中與數據庫連接參數即可,我想問這些.ini文件只能使用手工編寫嗎,我見到很多.ini文件參數極多不象手寫好象是機器生成的,不知道如何生成啊?請大家指教
1、其實PB中在新建---點TOOL----FILE EDIT 可以生成(編輯)INI文件。最直接就是工具欄中的EDIT圖標。
2、機器生成代碼是:點DATABASE圖標-----選擇連接方式。如:選 MSS MICROSOFT SQL SERVER 右鍵-NEW
PROFILE 按要求填定一些參數后在--PREVIEW中可以看到代碼,把它復制到INI文件中就行了。
3.編程經驗--PB數據庫連接
通常在使用PB和數據庫管理系統(DBMS)連接時,使用兩種方式:
一、開放數據源接口(ODBC)連接
ODBC是通過支持美國微軟公司開放服務結構(WOSA,Windows Open Services
Architecture)中的一部分.在PB 中通過配置
SQLCA.DBMS=‘ODBC’對象的屬性可使應用程序通過ODBC連接到數據庫。
ODBC的具體配置包含了數據源、驅動程序類型、緩沖池等各種細節參數。
例子:
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm="ConnectString='DSN=xxx_dsn;UID=xxx;PWD="',ConnectOption='SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT'"
二、專用數據庫接口
每個數據庫管理系統(DBMS)均提供相應的客戶端驅動,為了更好的服務於數據庫。
在這里我們使用的是Microsoft sqlserver 2000 的客戶端程序。通過設置 SQLCA.DBMS ="MSS
Microsoft SQL Server" 使客戶端通過專用數據庫接口連接到數據庫。
該類接口的參數配置除了服務器名、數據庫名、LogId、LogPass外還包含了連接協議等用戶驗證方式等,可通過服務器端或客戶端的配置程序進行配置。
SQLCA.dbms= "MSS Microsoft SQL Server" //接口類型
SQLCA.database= "master" //數據庫
SQLCA.userid= ""
SQLCA.dbpass= ""
SQLCA.logid= "sa"
SQLCA.logpass= "xxxx"
SQLCA.serverName= "./xxx"//服務器名
SQLCA.dbparm= "CommitOnDisconnect='No'"
SQLCA.autocommit= false
以上介紹的是PB與數據庫連接時常用的方法。
往往根據不同的應用環境選擇連接方式,
在單機環境下多采用的是ODBC連接,因為在發行環節上相對要容易些。在網絡環境下多采用專用數據庫連接,這樣可以提高系統的可靠性與執行效率。專用數據庫的發行環節往往要配上相應DBMS客戶端的動態連接庫(DLL),並把它存放在應用程序當前路徑,或存放在%SYSTEM%下面。
我在開發中用到了對BLOB類型的數據進行存取,大家都知道POWERBUILDER
對BLOB字段的支持是有限的,每次只能處理32KB的數據塊,如果一個文件大於32K必須編寫相應的程序進行處理。當時的開發環境是PWOERBUILDER
9.0 + MS SQL SERVER 2000 +WINDOWS2000 。
當通過ODBC連接數據讀取BLOB字段時,通過MESSAGEBOX彈出的字節數,觀察到只要超過32K的文件出現,LEN(BLOB)就會出錯,始終返回是32K字節的長度。當時很令人費解,隨即懷疑系統問題,檢查病毒,重新安裝相應的開發環境,結果依舊,這才懷疑到ODBC可能存在問題,因為微軟是問題專家,同時也是解決問題的專家。當通過SQLSERVER
專用接口連接后,一切正常。由此證明了ODBC 與專用數據庫接口之間存在着一定的問題。
由此可說明各種同類技術之間的細微差別,可能會給我們帶來意想不到的問題。在開發時還需謹慎、全面的考慮所用技術的可靠性。
PowerBuilder 與 Sybase ASA 數據庫連接問題
QUOTE:
Sybse ASA (Adaptive Server Anywhere) 在安裝完整版 PowerBuilder 時可以選擇安裝 ,
PowerBuilder 的例程也是以 ASA 作為數據庫的.
一. ASA 數據庫連接步驟
QUOTE:
1.
添加數據源。在WINDOWS中點擊我的電腦,選擇控制面版,選擇ODBC數據源32位,選擇系統DSN,點擊"添加",然后選擇你使用的數據庫.
2. 在工具條上點擊DB PROFILE 選擇已建立好的數據庫連接,單擊 EDIT 在彈出的對話框中選PREVIEW
里面就是連接數據庫的語句,直接 COPY就OK了。
二. ASA DB_profile寫法 (以lin.com的tax例程為例)
tax.ini
CODE:
[Database]
DBMS=ODBC
Database=test
DbParm=connectstring='dsn=sybase_lin;UID=dba;PWD=sql'
[Copy to clipboard]
三. 打包所需文件
參看以下文章:
http://www.laozang.com/pbbbs/read.php?tid-233.html
四. 容易出現的問題及解決方法
導致ASA數據庫無法連接的問題有以下幾種:
1、ODBC配置錯誤。沒有配置數據源,數據庫的用戶名或口令錯誤等都會導致數據庫無法連接。
解決的辦法:檢查數據源的配置,如果沒有在ODBC中配置數據源則按照向導添加數據源即可;口令錯誤只需改為正確的即可。
2、連接時提示LOG文件錯誤。這樣的問題大多出現在重裝系統后、源碼移植到其他系統、數據庫文件路徑改變之后。
解決的辦法:在創建ASA數據庫的時候不創建LOG文件,如果已經創建了LOG文件則可以利用PB自帶的工具Sybase
central來去掉LOG文件和數據庫文件的關聯。操作步驟如下:
a)啟動Sybase central在左邊的樹型目錄中選擇Utilities;
b)雙擊右邊出現的條目中的change log file settings,直接next;
c)點Browse選擇需要去除log文件的數據庫文件,選好后next;
d)這里你會看到一些數據庫的信息,log文件名,文件大小等。next;
e)去掉Maintin the following transaction log
file前面的對勾,Finish;
f)配置ODBC連接數據庫就可以了。
3、數據庫文件損壞。此類錯誤一般不常見,可能由於病毒破壞或誤操作引起。
解決的辦法:如果以前有備份用備份文件覆蓋原文件即可,如果沒有備份文件就只能重新建庫了!
PB8如何使用OLE DB練到ASA數據庫
(本文來自sybase網站 翻譯 by 金色年華)
原文出處:
http://www.sybase.com.cn/cn/content/support/exp_jszc_pb_dbms_00017.htm
Connecting to ASA Server (7.01 GA) via OLE DB in PowerBuilder 8
Adaptive Server Anywhere includes an OLE DB provider named ASAProv.
One of the features of ASAProv (dboledb7.dll) is that you do not
have to deploy ODBC. In other words, you can connect to an ASA
database either via OLE DB or via OLE DB/ODBC bridge.
在pb中通過OLE DB連接到ASA數據庫的步驟如下:
在命令提示符下鍵入如下命令,啟動 ASADEMO:
dbsrv7 asademo -x tcpip -n asademo
("asademo" - 你選擇運行的數據庫. 確定你沒有正在運行一個同名的數據庫,否則會出錯)
有兩個方法通過 OLE DB 連接到 ASA Server:
1) OLE DB/ODBC bridge
對於這種連接,你必須在數據庫參數中,指定有效的 ODBC 數據源,連接的腳本如下:
// Profile asa_oledb
SQLCA.DBMS = "OLE DB"
SQLCA.LogPass = "sql"
SQLCA.LogId = "dba"
SQLCA.AutoCommit = False
SQLCA.DBParm = "PROVIDER='ASAProv',DATASOURCE='asa'"
2) OLE DB (不需要配置 ODBC)
你可以通過一個擴展名為.udl的單獨的文件,提供連接信息,在OLE DB中訪問數據.這個文件與 Microsoft DataLink
(.udl) file 類似. 你必須在系統中安裝 Datalink API 以便於創建和使用 .udl 文件.
創建 .udl文件的方法:
在當前目錄里的空白處單擊鼠標右鍵,選擇新建文件,選擇 Microsoft Data Link.如果沒有創建 Microsoft Data
Link 的選項,需要創建一個文本文件,然后更改擴展名為
.udl.雙擊這個文件,添加連接信息.詳情請訪問msdn.microsoft.com 搜索 Data
Link(此處原文有亂碼,具體內容不詳).
在pb中使用 .udl 文件時,要確認在數據庫中已經創建了 Catalog Tables
(由pbcat...名字開頭,然后用這幾張表存放一些PB中的信息,如果這幾張表無法創建,就會出現出錯信息).你可以通過連接到系統中已有的ODBC
數據源. 如果這些表不存在,就會提示 Catalog Tables沒有被創建.
用以下信息來創建.udl文件:
Provider Tab:
Select "Adaptive Server Anywhere Provider"
Connection Tab:
Location: eng=asademo;dbn=asademo;Links=TCPIP{};
Select radio button for
一.連接步驟
1)服務器安裝SQL Server並啟動,創建數據庫。
2)客戶機安裝SQL Server客戶端。
3)啟動PB,配置數據源描述(通過直連接口,不建議用ODBC)。
4)連接。
二.DB_profile的寫法
在ini文件里設置
[Database]
DBMS=MSS Microsoft SQL Server 6.x
Database=databasename
UserId=
LogID=
DatabasePassword=
LogPass=
ServerName=
AutoCommit=False
在程序里用profilestring讀取
附加資料:ms sql server 配置文件設置
ms sql server 配置文件設置:
dbms="mss"//只須在*.ini文件中用這個代碼便告訴pb使用的ms sql server
Database:所用數據庫
LogId:sql server的登陸賬號
LogPass=口令
servername:允許數據庫服務器連接的計算機名
autocommit:控制pb 是工作在事務處理范圍內還是工作在事務處理范圍外
dbparm:dbms的專用連接參數
以下參數:
language:在顯示錯誤消息和日期格式時指定要使用的語言,在服務器上必須設置該直.
lock:事務處理隔離層
log:文本和圖像數據的更新是否應該紀錄到事務日志中.
systemprocs:系統存儲過程和用戶定義的存儲過程是否顯示在各種各樣的pb畫板中.
pbcatalogowner:pb存儲中表的缺省者.
async:允許在服務器上進行同步操作.0:同步,1:異步
dbgettime:當async=1時,使用該參數設置用戶在檢索行時pb等待來自pb的響應的秒數.
cursorlock:release和cursorscroll參數一起使用可設置光標的鎖定選項.lock,opt,optval,readonly
cursorscroll:設置光標的滾動選項.
staticbind:控制pb是否在檢索數據前獲取dbms中的結果集描述.
dbtextlimit:控制返回的文本字段的最大長度而不用將文本作為二進制大型數據對象來處理.
appname:設置連接時所使用的應用程序名.
host:設置連接似的工作站名.
packetsize:設置使服務器向pb傳送數據時所設置的包大小.
secure:設置是否想使用winnt集成邏輯安全性和安全sql server連接 缺省0使用標准安全性,1集成安全性.
PowerBuilder與Oracle 7.3 的連接
PowerBuilder與Oracle的連接
PowerBuilder(PB)和Oracle分別是前端開發工具和RDBMS的主流產品。PB提供了兩種與Oracle連接的接口:PowerSoft內置的數據庫接口(Native
Database
Interface)和ODBC接口。本文介紹使用PB6.0內置Oracle接口的方法,包括數據描述文件的設置、存儲過程的調用和存儲過程作為數據窗口數據源的操作方法等內容,使用的RDBMS的Oracle
7.3。
PowerBuilder與Oracle的連接
假定已安裝Oracle客戶端應用程序。可用Sqlplus或Tnsping等是否能連接到Oracle數據庫,確定在SQLNET配置文件中使用的數據庫別名(Database
Alias,又稱服務器名,Server
Name)。如有疑問,可在Oracle客戶端程序目錄下tnsname.ora文件中找到。另外保證搜索路徑已包括SQLNET應用程序的安裝目錄(如C:/ORAWIN95/BIN)。
進入PB的Database Profiles畫筆,可看到所有已安裝的數據庫接口(PB6.0缺省安裝的是Oracle
7.3版的接口,如使用低版本的Oracle,需在安裝時指定),選擇“O73 Oracle
7.3”,點擊“New”按鈕,進入Database Profile Setup對話框。在“Connection”頁輸入下列信息:
Profile Name:為該Database Profile起一個有意義的名稱;
Server:@TNS:ServerName,其中ServerName為上述數據庫別名(服務器名),如@TNS:ORA73;
Login ID:Oracle數據庫中實際的用戶名,由於PB初次連接到數據庫時要自動建立五個系統表(PowerBuilder
Catalog
Table:PBCATTBL,PBCATCOL,PBCATEDT,PBCATFMT,PBCATVLD,存儲表的擴展屬性),因此第一個連接到Oracle的用戶必須具有建表、給PUBLIC角色授權等權限。例如可用SYSTEM用戶進行第一次連接,此后的連接對用戶則無特殊要求;
Password:該用戶的口令。
設置上述內容后,即可連上Oracle。為優化數據庫連接,還可設置下列選項:
Prompt for Database Information:連接時是否提示用戶輸入用戶名和口令;
Generate Trace:啟動DB跟蹤工具,跟蹤連接;
Thread Safe:開發需要多線程環境支持的分布式應用時,選擇該項。缺省為未選,適用於非分布應用;
PBDBMS:與存儲過程調用方式有關的參數。Oracle為7.2或更高版本時,清除該選項,此時帶IN
OUT參數的存儲過程可作為數據窗口數據源。7.2版本以下,選擇該項,調用PBDBMS.Put-Line建立存儲過程的SQL語句,缺省是選中;
Commit on Disconnect:斷開連接時,指定提交或回退未提交的事務;
Case Sensitive:連接的Oracle服務器是否區分大小寫。注意該項選中時,所有主鍵、包含主鍵的表名、外鍵須全為大寫字符。
PowerBuilder Catalog Tables
Owner:指定擁有PB系統表的用戶,缺省為“SYSTEM”。如果要使用多種顯示格式或有效性規則,可以在不同的用戶下建立幾套系統表;
Table Criteria:指定滿足哪些條件的表、視圖和同義詞可在“Select
Tables”對話框中顯示出來。例如DEV用戶下銷售子系統的表都以SALE開頭,則可以用SALE%、DEV、“TABLE”、“VIEW”指定只顯示DEV用戶以SALE開頭的表和視圖;
Asynchronous:選擇該項,可在一個復雜的SQL語句執行過程中,返回第一行結果前,切換到其他操作;
Number of Seconds to Wait:若上一項選中,還可進一步通過該項指定檢索數據時,等待數據庫響應的時間;
Retrieve Blocking Factor:決定數據窗口對象一次可從數據庫取出的記錄數;
Number of SQL Staments
Cached:PB可將數據窗口對象產生的SQL語句和嵌入式SQL語句保存在SQL語句緩沖區,該參數指定緩沖區為PB保留的SQL語句數目。該數值可由下式計算:SQLCache=服務器OPEN—CURSORS數-5(保留的游標數)-本連接預期使用的最大游標數;
Disable Bind:指定是否將輸入變量與SQL語句綁定,此參數影響PB為數據窗口對象生成INSERT語句的方式;
Static Bind:數據窗口對象檢索數據前是否檢測SELECT語句的合法性;
在Syntax頁,還可指定日期、時間的格式等。在Preview頁可查看Database
Profile設置對應的PowerScript寫法。
Oracle存儲過程的使用
歸納起來PB6.0中調用Oracle存儲過程有以下四種方法。
方法一:以關鍵字RPCFUNC聲明存儲過程;
方法二:以DECLARE PROCEDURE語句聲明存儲過程;
方法三:以動態SQL語句實現;
方法四:調用函數PBDBMS.Put-Line。
一般情況下,方法一能得到較好的運行效率和更完善的功能。因此推薦使用方法一。但是某些類型的存儲過程只能使用其他方法。以下重點介紹方法一和方法二。
兩種方法比較起來,有以下幾點主要區別:
1)方法一適用於具有IN、OUT和IN OUT參數的存儲過程,而方法二僅支持IN和OUT參數,不支持IN OUT參數;
2)方法一對參數的數目無限制,方法二最多支持255個參數;
3)方法一不支持記錄(Recorder)的傳遞,方法二可傳遞和接收記錄。
方法一操作步驟:
1)在用戶對象畫筆中創建一個Class-Standard類型的,從Transaction繼承的用戶對象。
2)在此用戶對象中,聲明Local External
Functions,將存儲過程以RPCFUNC關鍵字聲明為外部函數。在Declare Local External
Functions對話框中按Procedures按鈕選擇要調用的后台存儲過程,或直接輸入類似subroutine TEST(long
id,ref string name)RPCFUNC ALIAS FOR “DEV TEST”的語句。例如中DEV
TEST的參數為(id IN
NUMBER,name IN OUT VARCHAR2)。
3)保存該用戶對象。
4)在Application畫筆中,進入應用屬性對話框,在Variable
Types頁,將上Transaction用戶對象設置為缺省的全局變量SQLCA。
5)腳本中,編碼調用相應的外部函數。形式:SQLCA 函數名(參數)。如可用“SQLCA
TEST(ln—id,ls—name);”調用例子中定義的DEV TEST存儲過程。其中ln—id,ls—name為調用參數。
方法一注意事項:
1)由於PB中String類型的數據長度是動態分配的,因此對Ref
String類型的參數,每次調用前需要申請足夠的空間。例如上例從輸入的id值檢索name,后台聲明的NAME數據類型為VARCHAR2(30),每次調用SQLCA
TEST前需要用ls—name=SPACE(30)置ls—name為足夠長度的空串。
2)類似地當傳遞的參數為數組(后台稱PL/SQL
Table)時,聲明參數為相應類型的動態數組,並在每次調用前設置數組上界為足夠大的值。例如:DEV用戶的DEPT包中聲明了TYPE
tbl—name IS TABLE OF VARCHAR2(30) INDEX BY
BINARY—INTEGER;存儲過程EMP—OF—DEPT(dept—id IN NUMBER,name OUT
DEPT.tbl—name)返回部門編寫為dept—id的部門的所有員工,置name數組中。假定所有部門
的員工數目不超過100,則可用以下語句聲明和調用DEV.EMP—OF—DEPT:
Declare External Functions對話框中:
Subroutine EMP—OF—DEPT(long dept—id,ref string name[]) RPCFUNC
ALIAS FOR ″DEV.EMP—OF—DEPT″
PowerScript腳本中:
long ln=dept—id
string lsa—name[]
……
lsa—name[100]=″ //置動態數組lsa—name上界為100
ln—dept—id=2
SQLCA.EMP—OF—DEPT(ln—dept—id,lsa—name) //檢索部門2的所有員工的名字
方法二使用方法:
在腳本中加入如下編碼(以DEV TEST為例):
long ln—id
string ls—name
ln—id=100
DECLARE test PROCEDURE FOR DEV.TEST(:ln—id); //test有一個IN參數,一個OUT參數
EXECUTE test;
FETCH test INTO:ls—name;
方法三使用方法:
根據輸入輸出參數的不同,PB中的動態SQL語句有四種格式:1)無輸入輸出參數;2)只有輸入參數,無輸出參數;3)有確定數目輸入輸出參數;4)輸出結果列的數目不定。其中第1)、第2)中格式的動態SQL語句也可用來調用簡單的存儲過程。
1)沒有輸入輸出參數的存儲過程。例如DEV DEMO1存儲過程沒有輸入輸出參數,可用下列語句調用:
sqlstring=″EXECUTE DEMO1()″
EXECUTE IMMEDIATE:sqlstring;
2)只有輸入參數的存儲過程。例如DEV.DEMO2(name IN VARCHAR2,birthday IN DATE)
PREPARE SQLSA FROM ″EXECUTE DEMO2(?,?);″
EXECUTE SQLSA USING:ls—name,:ldt—birthday;
如果是7.2以下版本的Oracle,可用方法四PBDMBS.Put—Line()函數調用建立存儲過程。此時需選上Database
Profile中的PBDBMS復選框。
存儲過程作為數據窗口的數據源
以一個簡單數據窗口(顯示服務器的系統時間)為例說明怎樣創建存儲過程作為數據源的數據窗口。
1)在某個包(如PACK—TYPE)中定義日期類型的Recorder自定義數據類型datarec;
2)創建返回系統時間的存儲過程:
PROCEDURE get—sysdata(sysdt IN OUT PACK-TYPE.datarec)IS
BEGIN
open sysdt for select sysdate from dual;
END;
3)新建數據窗口,數據源選擇Stored Procedure;
4)在隨后的Select Stored Procedure對話框中選擇get—sysdate即可。
如果作為數據源的存儲過程有IN參數,則這些參數就是數據窗口的檢索參數(Retrieve Argument)。
Support for Using PowerBuilder and Oracle 8.x and 9.x and 10g
Oracle 8.x and 9.x and 10g 的 pb 支持情況
http://www.sybase.com/detail?id=1011566
PB10連接SQL Server的配置
可能初次使用pb10的朋友無法順利連接到sql server,一方面沒有了mssql
server專用接口了,另一方面數據庫管理系統(DBMS)換成了“OLE DB”,配置起來有點不順手!下面就來介紹pb10中用OLE
DB連接sql 2000數據庫。
在安裝pb10的時候選擇custom/full方式安裝(默認的安裝方式不會安裝ole
db接口),next-》如果你沒有安裝.net則不要選擇列表中的ADO.net....項。一路next完成安裝。
在數據庫畫板中找到OLE microsoft OLE DB項,在其上右鍵新建一個配置,在彈出的配置窗口中:
profile name:填寫配置文件名 //任意即可
provider:選擇數據庫管理系統類型,這里選擇“SQLOLEDB”項
data
source:服務器名(和之前的版本不太一樣)。可以在下拉列表中選擇,也可以填入服務器名或IP地址如:127.0.0.1等。如果上面的provider不是“SQLOLEDB”則此下拉列表中可能沒有選項。
user ID:用戶名。我的用戶名是默認的sa
password:對應上面user ID的密碼,我的密碼是空的,所以不填。
到這里你就可以順利的連接到sql
server了。但是連接到哪個數據庫呢?上面的參數都沒有指明,我也找了半天:P。不要着急,在Extended里填入
“database=數據庫名” 就可以了。(不要引號)
最后的配置文件內容為:
// Profile his
SQLCA.DBMS = "OLE DB"
SQLCA.LogId = "sa" //我的用戶名是sa
SQLCA.AutoCommit = False
SQLCA.DBParm =
"PROVIDER='SQLOLEDB',DATASOURCE='NETMANAGER',PROVIDERSTRING='database=zs'"
//我的數據庫名是:zs;datasource后面也可以是IP地址:DATASOURCE='127.0.0.1'
至此就完成了pb10下用OLE DB連接sql server的配置!
輕易不出手,出手必傷人!傷着你了可別怨我哦!
在PB中使用FoxPro數據庫的方法
重慶工業管理學院 蔣波
---- Power Builder
是十分優秀的用於客戶/服務器環境信息管理系統開發工具,其優秀之處不僅是因為可以開發基於客戶/服務器模式的系統,而且簡單、易學,Power
Builder
自身是沒有數據庫管理系統(DBMS)的,它是首先通過不同的驅動程序聯接不同的數據庫,再通過這種聯接,實現對數據的管理。Power
Builder同時隨盤附帶有一個小型的數據庫管理系統:SQL Anywhere,所以用戶也可以直接開發用於單機的完整的信息管理系統。
----
本人以前曾開發過基於FoxPro環境下的數據庫系統,但FoxPro的編程太麻煩,不但要處理數據的管理,而且還要花大量的精力處理輸入、輸出的格式等。但有着可視化編程環境的Power
Builder卻不同,處理輸入、輸出是件相當簡單的事情,於是,本人償試用Power Builder來管理以前的數據庫。 c在Power
Builder系統中,使用FoxPro的數據庫有兩種方法:一是利用ODBC聯接FoxPro數據庫;另一種方法是將FoxPro的數據庫轉換到SQL
Anywhere的數據格式。
---- 一、 利用ODBC聯接FoxPro數據庫
---- 在Power Builder中,直接訪問FoxPro數據庫只能通過ODBC方式。
---- 在開發環境下,可以直接在PowerBar畫板上配置ODBC,聯接FoxPro數據庫,方法如下:
單擊Configure ODBC工具鈕
在Installed Drivers目錄框中選擇:Microsoft Foxpro Driver (*.dbf)
單擊“Create”按鈕
命名數據源名、選擇版本
取消“使用當前工作目錄”選項
單擊選定目錄,選擇被聯接數據庫所在的目錄
確定退出
----
通過ODBC方式聯接的FoxPro的數據庫,一定要滿足FoxPro的數據庫格式,即數據庫文件結構必須是:“32字節文件描述若干個32字節的字段描述
結構描述結束符(0D) 記錄1,記錄2,…… 文件結束符(1A)”。由此看來,傳統的DBF數據庫文件均可通過該方式聯接。對於Visual
FoxPro環境下建立的表(Table),其結構與傳統的數據庫結構是不同的,它在字段描述結束符(0D)與記錄之間加上了二百多個字節的內容,但在未納入VFP的數據庫(Dbc)之前,其內容為“00”,此時仍可以通過這種方式聯接,一旦納入數據庫中,該段字節已被填上了其它內容,無法再聯接。
---- 在Power
Builder應用程序中,使用事務處理對象來聯接數據庫,這種事務處理對象,即有默認的SQLCA,用戶也可以自己生成,以方便訪問多個數據庫。在程序中使用事務處理對象時,一般必須先指明DBMS、DbParm兩個屬性,對於FoxPro數據庫,還必須指明
Database、 userid、servername、幾個屬性,這一點是與訪問其他類型的數據庫不同的地方。
sqlca.dbms="ODBC" // 指定聯接方式ODBC
sqlca.database="D:/prg/pubdata" // 指定被聯接數據庫所在目錄
sqlca.userid="public" // 用戶識別號,都為 public
sqlca.servername="FOXPRO" // 服務器名:均為FOXPRO
sqlca.dbparm="Connectstring='DSN=tscxs'" //數據源名
connect using sqlca; // 實施聯接
……
---- 通過對FoxPro數據庫的聯接,用戶便可以在Power
Builder開發環境下、應用程序中使用這些數據庫,快速地開發出自己的信息管理系統,實現對這些數據庫的維護與管理。
---- 二、 將DBF文件轉換為SQL Anywhere 的DB文件格式
---- 在Power Builder環境下,附帶有一個數據庫系統——SQL Anywhere,在Power
Builder中利用它,用戶可以直接建立、維護數據庫。在SQL
Anywhere中,數據庫結構雖然與VFP不同,但概念是一致的,即:數據庫是系統中相關的各種數據,這些數據又因不同用途組織成不同的表,這些表共同構成數據庫,與傳統的數據庫(DBF)相類比,PB、VFP中的表即是傳統意義的數據庫,PB、VFP中的數據庫類似於傳統的數據庫(DBF)文件所在的目錄。SQL
Anywhere中提供了將傳統的DBF文件轉換為該系統下的數據庫文件(DB)中的表的工具。為了實現這一轉換,用戶必須先建立一個新的表,再將DBF格式的文件內容導入該表中。
----
對於DBF文件,必須是傳統意義上的數據庫,如FoxPro、dBase、FoxBASE環境下的數據庫文件。該種數據庫文件嚴格遵循“數據文件==數據庫結構+數據庫記錄”這一格式。其結構如下:“32字節文件描述若干個32字節的字段描述
結構描述結束符(0D) 記錄1,記錄2,…… 文件結束符(1A)”
03 62 0A 07 02 00 00 00 - 81 00 4C
00 00 00 00 00 // 文件描述:時間、長
00 00 00 00 00 00 00 00 - 00 00 00
00 00 00 00 00 度、記錄長、記錄數
4E 41 4D 45 00 00 00 00 - 00 00 00
43 01 00 00 00 // 第一個字段:名、類
28 00 00 00 00 00 00 00 - 00 00 00
00 00 00 00 00 型、長、起始位
41 55 54 48 4F 52 00 00 - 00 00 00
43 29 00 00 00 // 第二個字段
0F 00 00 00 00 00 00 00 - 00 00 00
00 00 00 00 00 ……
0D 20 50 6F 77 65 72 42 - 75 69 6C
64 65 72 20 50 // 結構結束符(0D)、
72 6F 67 72 61 6D 6D 69 - 6E 67 20
20 20 20 20 20 記錄1
20 20 20 20 20 20 20 20 - 20 20 4A
6F 68 6E 20 53 ……
6D 69 74 68 20 20 20 20 - 20 1A
// 文件結束符(1A)
---- 將DBF文件直接轉換為PB(SQL Anywhere)中的表,操作步驟如下:
在PB 中建立新表
打開新建的表
單擊數據庫畫板中的“數據操作(Data manipulation)”按鈕
選擇菜單:Rows ? Import
從“文件類型”下拉框中選擇dbaseII & III(*.dbf)
選擇被導入文件所在的目錄及文件名
單擊“打開”按鈕
系統將打開指定的文件,將該文件中的所有記錄導入新建的表中。
---- 但系統不提供直接將導入數據保存在本數據庫(表)中。如果要將導入的記錄保存為SQL Anywhere
環境下的數據庫(表)中,可以先將導入數據行以SQL格式保存在 .sql 類型文件中,在利用SQL語句將這些數據行插入新表中。步驟如下:
按上面所列的步驟導入數據庫(DBF)文件中的數據
選擇菜單:File ? Save Row As …
在“存為類型”列表框中選擇:SQL
選擇保存路徑,輸入保存文件名,單擊保存
關閉“Data manipulation”窗口,回到數據庫畫板
單擊“DB Administration”(數據庫管理器)
選擇菜單:File ? Open
確信文件類型為:SQL (*.sql)
選擇第4步中所保存的文件,單擊“打開”按鈕
刪除文件起始部分的第一條SQL語句:CREATE TABLE
單擊“Execute”(執行)按鈕,系統將把原數據庫中的所有行插入到新表中。
---- 需要注意的是,新建的表在字段設置上必須與原DBF文件中的字段保持一致,即:
新表中的字段數必須等於或大於原DBF文件中的字段數
新表中的字段順序要與原文件中的字段順序一樣,即使新表中字段數更多,但新的字段必須放在最后
新表與舊文件中字段名可以不一樣
新表中的數據類型必須與舊表中的數據類型兼容:字符 ? 字符, 數值 ? 數字,數字 ? 字符……
數據格式相一致,如兩個文件中的日期格式必須一致
新表中字段長度必須能容納舊數據庫文件中的對應字段中的數據,如:舊數據庫某一字段寬度為C20,但庫中所有記錄在該字段的實際最長為14,那么,新表中的字段寬度至少應為C14
---- 如果你願意,也可以將原FoxPro中的數據庫先轉換到TXT格式文件,再將TXT格式的文件導入SQL
Anywhere數據庫(表)中,不過TXT文件中一條記錄獨占一行,各字段間必須用Tab鍵(符)隔開,其導入方法與DBF文件中數據的導入方法類似。
---- 以上兩種辦法均可實現在Power Builder下訪問FoxPro數據庫,但兩種方法之間有些不同之處:
從系統需求來看:第一種方式使用ODBC直接訪問DBF文件,只要Power
Builder基本系統即可,不需要安裝數據庫管理系統(DBMS);而第二種方式必須安裝SQL Anywhere系統。
從運行效率來看:第一種方式速度要慢一些,后一種方式稍快。筆者在應用程序中比較了兩種方式在速度上的差異:將FoxPro系統中的一個有15000余條記錄的數據庫,用第一種方式聯接、在數據窗口控制中顯示(Retieve)記錄,需要6秒鍾左右,后來又用第二種方式:在SQL
Anywhere
中新建一個表,將這15000條記錄導入表中,聯接、顯示記錄,需要時間為3-4秒。對另一個擁有19萬余條記錄的FoxPro數據庫直接使用ODBC,聯接、顯示的時間為85秒鍾。
---- 使用Power Builder
的主要優勢體現在建立客戶/服務器模式的系統上。對於一般的單機系統、規模較小的系統,可能大多數人不會想到它。但如果你覺得FoxPro太老土,Visual
FoxPro又太難學的的話,不妨試試Power Builder。
如果不曾跟着世界旋轉,那么就在安靜中尋找自我...
PB連接my sql數據庫!(by laozang)
ok 非常好!支持!
Edit by laozang
真是失敗!沒有給自己多留幾個位置,只能在這里弄了!
有幾位朋友說要pb連接mysql的數據庫,我在網上找了一個例子,不知道正確不正確,大家看看,好使的話,就說一聲!
PB下連接Mysql
需要安裝myodbc,具體的安裝和設置請參閱:
http://dev.mysql.com/doc/refman/5.0/en/myodbc-installation-binary.html#myodbc-installation-binary-windows-installer
使用DSN方式:
ConnectString='DSN=dl;DESC=MySQL ODBC 3.51 Driver
DSN;DATABASE=xxxx;SERVER=xxx.xxx.xxx.xxx;UID=xxxx;PASSWORD=xxxx;PORT=3306;SOCKET=;OPTION=3;STMT=;'
或者
ConnectString='DRIVER={MySQL ODBC 3.51
Driver};SERVER=xxx.xxx.xxx.xxx;DATABASE=xxxx;UID=xxxx;PWD=xxxx;PORT=3306;OPTION=3'
PB中連接Access數據庫的三種方法
QUOTE:
太好了,對於我們這些新手來說,太有幫助了!
Edit by laozang
PB中連接Access數據庫的三種方法
方式一:
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='driver=Microsoft Access Driver
(*.mdb);DBQ=c:/foodmart.mdb'"
CONNECT;
IF SQLCA.SQLCode <> 0 THEN
MessageBox("數據庫連接失敗","請與管理員聯系。錯誤號:" + String(SQLCA.SQLCode) +
"~r~n錯誤原因:" + SQLCA.SQLErrText)
RETURN
else
MessageBox("數據庫連接成功","現在進入系統... ...")
end if
方式二:
SQLCA.DBMS = "OLE DB"
SQLCA.AutoCommit = False
SQLCA.DBParm =
"PROVIDER='Microsoft.Jet.OLEDB.4.0',DATASOURCE='C:/foodmart.mdb'"
CONNECT;
方式三:
建立DSN,通過ODBC連接。這個就不用多說了。
例如:
// Profile my_ass
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=my_ass'"
catalog tables could not be created and are not available for use
問題解決方法:
這種情況多見於從SQL server 轉到 Access 數據庫,用ODBC連接的情況
把sqlserver數據庫里的五個‘pb’字母開頭的數據表導入到access數據庫里去,再連接就不提示了
關於動態注冊ODBC數據源
關於動態注冊Access數據源
//***********************************************
// 函數名: gf_setodbc_access
// 功能: 完成access數據源的注冊功能
// 輸入參數:
// as_database 數據庫名
// (即Access數據庫文件名字,不含擴展名)
// as_path 數據庫文件所在的目錄
// 返回值:
// true 表示自動配置成功
// false 表示自動配置失敗
// 設計者: Adamswater
// 完成時間: 2005年6月
//***************************************************
boolean lb_rtn
string ls_root,ls_root_dsn,ls_root_Jet,ls_root_Engines
integer li_rtn
string ls_dsnname,ls_dbfullname,ls_driver,temp,ls_version
string ls_syspath
environment env
integer rtn
ls_syspath = Space( 40 )
//獲得*作系統的目錄
GetSystemDirectoryA(ls_syspath,60)
ls_driver = ls_syspath + "/odbcjt32.dll"
lb_rtn = true
ls_root = "HKEY_LOCAL_MACHINE/software/odbc/odbc.ini"
//數據源名字為:文件名字+“_DT”
ls_dsnname = as_database + "_DT"
ls_root_dsn = ls_root + "/" + ls_dsnname
ls_root_Engines = ls_root_dsn + "/" + "Engines"
ls_root_Jet = ls_root_Engines + "/" + "Jet"
ls_dbfullname = as_path + "/" + as_database + ".mdb"
//注冊數據源的名字
li_rtn = registryset(ls_root,ls_dsnname,regstring!,"")
if li_rtn= - 1 then
return false
end if
//注冊數據庫名字
li_rtn = registryset(ls_root_dsn,"DBQ",regstring!,ls_dbfullname)
if li_rtn= - 1 then
return false
end if
//注冊數據庫驅動程序
li_rtn = registryset(ls_root_dsn,"Driver",regstring!,ls_driver)
if li_rtn= - 1 then
return false
用PB連接Access數據庫(.mdb文件)在注冊表中的ODBC配置相關項-
QUOTE:
頂樓的拐子,你真是那個事。蠻欣賞你!
用PB連接Access數據庫(.mdb文件)在注冊表中的ODBC配置相關項
//***************************************************************************/
ODBC相關的鍵,主要有下面幾項:
HKEY_LOCAL_MACHINE/Software/ODBC/ODBCINST.INI/ODBCDRIVER
記錄所有已安裝的ODBC驅動程序;
HKEY_LOCAL_MACHINE/Software/ODBC/ODBCINST.INI 記錄各種ODBC驅動程序的相關信息;
HKEY_CURRENT_USER/Software/ODBC/ODBC.INI/ODBC Data Sources
記錄各種數據源的類型;
HKEY_CURRENT_USER/Software/ODBC/ODBC.INI 記錄各種數據源的詳細信息。
//***************************************************************************/
//ODBC下Access數據庫的鍵的配置
HKEY_CURRENT_USER/Software/ODBC/ODBC.INI/數據源名稱(如TEST)
//說明:"..."="HKEY_CURRENT_USER/Software/ODBC"
//鍵值設置
.../ODBC.INI/數據源名稱(如TEST)/DBQ REG_SZ 數據庫文件所在路徑
.../ODBC.INI/數據源名稱(如TEST)/Driver REG_SZ
odbc驅動所在路徑(C:/WINNT/System32/odbcjt32.dll)
.../ODBC.INI/數據源名稱(如TEST)/DriverId REG_DWORD 0x00000019(25)
.../ODBC.INI/數據源名稱(如TEST)/FIL REG_SZ MS Access;
.../ODBC.INI/數據源名稱(如TEST)/SafeTransactions REG_DWORD 0x00000000(0)
.../ODBC.INI/數據源名稱(如TEST)/UID REG_SZ
//子鍵沒有也可以
//子鍵配置(.../ODBC.INI/數據源名稱(如TEST)/Engines) 無(默認)
//子鍵配置(.../ODBC.INI/數據源名稱(如TEST)/Engines/Jet)
.../ODBC.INI/數據源名稱(如TEST)/Engines/Jet/ImplicitCommitSync REG_SZ
.../ODBC.INI/數據源名稱(如TEST)/Engines/Jet/MaxBufferSize REG_DWORD
0x00000800(2048)
.../ODBC.INI/數據源名稱(如TEST)/Engines/Jet/PageTimeout REG_DWORD
0x00000005(5)
.../ODBC.INI/數據源名稱(如TEST)/Engines/Jet/Threads REG_DWORD
0x00000003(3)
.../ODBC.INI/數據源名稱(如TEST)/Engines/Jet/UserCommitSync REG_SZ Yes
//***************************************************************************/
//PB中相關注冊表操作函數
RegistryGet ( key, valuename, { valuetype }, valuevariable )
RegistryKeys ( key, subkeys )
RegistrySet ( key, valuename, valuetype, value )
RegistryValues ( key, valuename )
//valuetype:
RegString!
RegExpandString!
RegBinary!
ReguLong!
ReguLongBigEndian!
RegLink!
RegMultiString!
//***************************************************************************/
//獲取操作系統的system目錄,並保存到ls_location變量
li_sysdir =
RegistryGet("KYEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Setup","SysDir",RegString!ls_location);
IF li_sysdir = -1 THEN
Messagebox('錯誤','應用程序無法獲取Windows的系統目錄,系統將終止運行!',Stopsign!);
RETURN;
END IF
//然后根據系統目錄得出odbc驅動(odbcjt32.dll)的路徑
//***************************************************************************/
//數據庫事務連接
SQLCA.DBMS = "ODBC"
SQLCA.Database = 數據庫文件名
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
sqlca.DbParm="Connectstring='DSN=數據源名稱;UID=sa;PWD=;"
connect using sqlca;
PowerBuilder連接Sybase SQL Server的注意事項
QUOTE:
怎樣連接到ACCESS啊???——可以不使用ODBC設置,直接用代碼完成嗎??
還是占個地方! by laozang
PowerBuilder連接Sybase SQL Server的注意事項
首先, 確認Open Client 已經安裝, 並正確配置, 且能夠通過wisql 或Sybase
Advantage查詢SERVER端數據庫中的數據.
PowerBuilder連接不上Sybase數據庫, 主要原因有以下幾點:
1) locales.dat 未正確設置
locales.dat 是Client端字符集設置文件, 一般在c:/sybase/locales/
目錄下。若操作系統平台是Windows 95, 則修改[NT]節下的相關內容;若操作系統平台是Windows 3.x,
則修改[win3]節下的相關內容。
a、應該有一行有關中國的國別設置:
locale = chs, us_english, iso_1
b、Client端的缺省字符集設置應該和Server端的字符集設置一致。
本例中將Client端的缺省字符集設為iso_1:
locale = default, us_english, iso_1
2) 重裝SQL SERVER后未運行pbsyc.sql
pbsyc.sql用於在Sybase數據庫中創建PowerBuilder所需的系統表和存儲過程,它在PowerBuilder安裝盤的server目錄下。當PowerBuilder第一次連接數據庫之前,或Sybase重裝之后,需要在isql或SybaseAdvantage中,用"sa"登錄到"master"數據庫,運行pbsyc.sql
. 另外,若連接的是Adaptive Server 11.5,需要先對pbsyc.sql文件做如下改動:
將"@@"替換為"@",但保留"@@error"和"@@isolation"
3) PowerBuilder是32位的,但Open Client是16位的,由於PowerBuilder需要通過Open
Client實現與數據庫的連接,所以Open Client必須與PowerBuilder同為32位,或同為16位。
4) 未安裝Sybase的直連接口(Native Driver)或ODBC接口(ODBC
Driver)PowerBuilder需要通過Native Driver或ODBC
Driver才能訪問數據庫,所以若需要訪問Sybase數據庫,Native Driver或ODBC Driver是必需的。
5) Open Client中定義的Server Name與PowerBuilder應用中SQLCA.ServerName
設置的值不一致。
6)
未將PowerBuilder的DLL庫的路徑名加到系統搜索路徑上由於PowerBuilder應用程序運行時需要一些DLL庫的支持,所以需要將PowerBuilder的DLL庫的路徑加到系統搜索路徑上。
下面是系統缺省的DLL庫安裝路徑:
長文件名安裝時:(PB6.0)
c:/Program Files/Powersoft/Shared/
長文件名安裝時:(PB5.0)
c:/Program Files/Common Files/Powersoft Shared/
短文件名安裝時:
c:/pwrs/sys32/