如圖:

環境PB5開發的ERP系統程式,之前連接的是Win2003 里的sql 2000.
電腦服務器壞了之后,就把資料庫物理拷貝出來,附加到新的電腦服務器里的 sql 2000里。
然后,客戶端就連接不上,提示:unable to connect: SQL server is unavailable or does not exist
連接方式:
[Database]
Vendors=ODBC,SYB SQL Server v4.x,SYC Sybase System 10 CTLIB,IN5 I-Net v5.x,MSS (Msoft) SQL Server 6.0,O71 ORACLE v7.1,O72 ORACLE v7.2
DBMS=MSS
ServerName=SQLSERVER
Database=dbname
UserID=
DatabasePassword=
LogId=sa
LogPassword=sapd
DbParm=
用上面這個方式連接不了新電腦里的資料庫,但是我用其他客戶端可以連接新電腦里的資料庫。
后來換了個連接方式:
[Database]
Vendors=ODBC,SYB SQL Server v4.x,SYC Sybase System 10 CTLIB,IN5 I-Net v5.x,MSS (Msoft) SQL Server 6.0,O71
ORACLE v7.1,O72 ORACLE v7.2
DBMS=ODBC
; DBParm=DelimitIdentifier can be added to DbParm
; to control whether quotes are placed around
; table and column names in SQL
; DbParm=DelimitIdentifier='YES'
DbParm="ConnectString='DSN=odbc1;database=dbname;server=SQLSERVER;UID=sa;PWD=sa'"
connect;
這個odbc1在客戶端里的ODBC資料源里添加了,然后成功連接資料庫,程式也可以登錄了
但是用的程序中出現了

另外,我在服務器里用程式也可以連接登錄,也不會出現這個錯誤,操作也正常。
我試過在win2008服務器里安裝sql2008結果也一樣。
有沒有辦法解決客戶端連接登錄后操作不會出錯的辦法?
這個ERP系統叫融豐,找了他們的電話已經沒有這個公司了。
uj5u.com熱心網友回復:
PB 反編譯一下PBD,看看資料庫連接的函式,有可能是指定了用戶和密碼,也就是SQL服務器要添加對應的用戶和密碼
uj5u.com熱心網友回復:
用戶名和密碼都有寫進去
uj5u.com熱心網友回復:
又比如埠號呢,有原始碼比較好確定問題uj5u.com熱心網友回復:
另外SQL2000有沒有SP3+uj5u.com熱心網友回復:
ODBC能連接證明埠號沒問題
uj5u.com熱心網友回復:
做過SP4 結果一樣
我還做了一個sql 2008結果還是一樣
就是在服務器本地可以用MSS連接,在客戶端不能用MSS連接。
用ODBC指定DSN就可以連接,但是程式出現上面的錯誤。
uj5u.com熱心網友回復:
我再做一次干凈的環境打個SP3補丁看看uj5u.com熱心網友回復:
如果沒有了廠家的技術支持,建議你,服務器的版本,補丁包,資料庫的版本,補丁包,都要和原來的一致。服務器的用戶名、密碼,資料庫的用戶名和密碼,以及認證方式。如果原來采用ODBC,最好采用同版本的ODBC。
不要輕易更改這些,因為你不知道他會不會和這些有關。
都保持了一樣再試試看。
uj5u.com熱心網友回復:
服務器的版本之前是日文版,現在改成中文版,SQL 的版本不變,補丁包也不變
原來是用MSS方式的,現在MSS方式連接不了
uj5u.com熱心網友回復:
PB的MSS方式,區分為TCP和命名管道,這個需要在服務器上都打開。最好保持原來的方式,否則不知道哪里會出現問題。
原來的是日文版,你最好也采用日文版。這個最好不要亂改。
因為有字符集,字符編碼這一說,最好和原來都保持一致。
uj5u.com熱心網友回復:
這是sql server 2008TCP和命名管道

這是sql server 2000TCP和命名管道
uj5u.com熱心網友回復:
[Database]
Vendors=ODBC,SYB SQL Server v4.x,SYC Sybase System 10 CTLIB,IN5 I-Net v5.x,MSS (Msoft) SQL Server 6.0,O71 ORACLE v7.1,O72 ORACLE v7.2
DBMS=MSS (Msoft) SQL Server 6.0
ServerName=RG
Database=YGERPN
LogId=sa
LogPassword=sasql
; DBParm=DelimitIdentifier can be added to DbParm
; to control whether quotes are placed around
; table and column names in SQL
; DbParm=DelimitIdentifier='YES'
DbParm=
;
AutoCommit=false
AutoQuote=1
; Columns defines how many columns are displayed
; when a table is expanded
Columns=8
;
ForeignKeyLineColor=16711680
IndexKeyLineColor=255
PrimaryKeyLineColor=65280
Prompt=0
Lock=
NoCatalog=No
ReadOnly=0
ShowIndexKeys=1
ShowReflnt=1
StayConnected=1
TableDir=1
TableListCache=18000
TableSpace=*
TerminatorCharacter=;
HideComments=0
ShowRefInt=1
; specify the background color for the column list window header band
TableHeaderColor=
; specify the text color for the column list window header band
TableHeaderTextColor=
; specify the background color for the column list window detail band
TableDetailColor=
; specify the text color for the column list window detail band
TableDetailTextColor=
; specify the text color for the column list window COLUMN NAME column in the detail band
TableColumnNameTextColor=
LEXICON=
path="c:\ERP\database\"
GLOBAL_USER_NAME='永冠塑膠制造(深圳)有限公司'
[TW_MRPII]
I=1
ServerName1=RG
Database1=YGERPN
GLOBAL_USER_NAME='公司'
GLOBAL_COMPANY_NAME='深圳市融豐軟體有限公司'
SYSTEM_STR = 'W_SYSTEM5'
timer = 60
ledger=ERP_FIN
這個是erp客戶端的INI檔案,我覺得這個是沒問題的,因為以前這個客戶端在XP系統和Win7還有Win10系統下都能連接,
問題的關鍵在于服務器肯定有什么地方要設定什么的.
uj5u.com熱心網友回復:
我前面有告訴你了,一勞永逸的方法就是,PB 反編譯一下PBD,找到資料庫連接相關的腳本,這些腳本能看出來,程式連接的方式,和一些需要的引數等等,這樣就知道服務器要做什么相關設定。uj5u.com熱心網友回復:
我下載了幾個反編譯的都是導不出來,能不能給個鏈接
或是我打包給你,你幫我看下?
uj5u.com熱心網友回復:
PBKiller2.5.189以前的版本都可以反編譯
uj5u.com熱心網友回復:
//string name
int rownum
this.triggerevent("timeway_splash")
//this.postevent("timeway_splash")
/* Populate sqlca from current PB.INI settings */
//sqlca.DBMS = ProfileString ("pb.ini", "database", "dbms", "")
sqlca.DBMS = ddlb_1.text
//sqlca.database = ProfileString ("pb.ini", "database", "database", "")
sqlca.database = ddlb_database_name.TEXT
//sqlca.userid = ProfileString ("pb.ini", "database", "userid", "")
sqlca.userid = sle_1.text
//sqlca.dbpass = ProfileString ("pb.ini", "database", "dbpass", "")
sqlca.dbpass = sle_2.text
//sqlca.logid = ProfileString ("pb.ini", "database", "logid", "")
sqlca.logid = sle_4.text
//sqlca.logpass = ProfileString ("pb.ini", "database", "LogPassWord", "")
sqlca.logpass = sle_3.text
//sqlca.servername = ProfileString ("pb.ini", "database", "servername", "")
sqlca.servername = ddlb_server_name.TEXT
//sqlca.dbparm = ProfileString ("pb.ini", "database", "dbparm", "")
sqlca.dbparm = sle_6.text
sqlca.lock = sle_5.text
sqlca.AutoCommit = true
string SYSTEM_STR
window wo
SYSTEM_STR = ProfileString ("timeway.ini","TW_MRPII","SYSTEM_STR","")
/* Uncomment the following for actual DB connection */
setpointer(hourglass!)
connect;
if sqlca.sqlcode <> 0 then
MessageBox ("Connect error","資料庫連接錯誤:無法連接資料庫." + sqlca.sqlerrtext)
return
end if
setpointer(hourglass!)
//if KeyDown(KeyEnter!)=TRUE then
integer PRIVIILEGE_VAR
string USER_NAME_VAR,PASSWORD_VAR
USER_NAME_VAR = w_m_login1_inv.sle_user_name.text
PASSWORD_VAR = w_m_login1_inv.sle_password.text
SELECT max(dbo.M_LOGIN.PRIVIILEGE)
INTO :PRIVIILEGE_VAR
FROM dbo.M_LOGIN
where LOGIN_NAME = :USER_NAME_VAR and PASSWORD = :PASSWORD_VAR;
USERNAME_FIRST = USER_NAME_VAR
IF PRIVIILEGE_VAR > 0 THEN
date dtu
dtu = date(2198,12,31)
if dtu < today() then
messagebox("OK","系統連接出錯!")
close(parent)
return
end if
declare dtu procedure for sysdtu;
sqlca.sqlcode = 0
execute dtu;
// messagebox('sqlca.sqlcode',string(sqlca.sqlcode))
if sqlca.sqlcode < 0 then
messagebox("Call vendor","請聯系軟體供應商...,系統連接出錯!")
close(parent)
return
end if
// messagebox('SYSTEM_STR',left(SYSTEM_STR,5))
name=sle_user_name.text
select count(*) into :rownum from m_login
where login_name = :name and
(part ='3' or part = '13');
if rownum<1 then
messagebox("OK","你不是本模塊用戶,無權使用本模塊.~r~n欲要使用本模塊,請聯系系統管理員.")
disconnect;
return
end if
if left(SYSTEM_STR,5) = 'W_SYS' then
// Open (wo,SYSTEM_STR)
// else
Open (w_genapp_frame_inv)
end if
close(parent)
// sle_password.setfocus()
ELSE
messagebox('OK!','非法用戶名或口令!')
disconnect;
LOGIN_NUMBER = LOGIN_NUMBER + 1
setpointer(arrow!)
if LOGIN_NUMBER > 2 then
messagebox('Exit','您無權使用本系統!')
setpointer(arrow!)
close(parent)
end if
END IF
//end if
uj5u.com熱心網友回復:
真正讀取的是timeway.ini
/* Populate sqlca from current PB.INI settings */
ddlb_1.text = ProfileString ("timeway.ini", "database", "dbms", "")
//sqlca.database = ProfileString ("timeway.ini", "database", "database", "")
sle_1.text = ProfileString ("timeway.ini", "database", "userid", "")
sle_2.text = ProfileString ("timeway.ini", "database", "dbpass", "")
sle_4.text = ProfileString ("timeway.ini", "database", "logid", "")
sle_3.text = ProfileString ("timeway.ini", "database", "LogPassWord", "")
//sqlca.servername = ProfileString ("timeway.ini", "database", "servername", "")
sle_6.text = ProfileString ("timeway.ini", "database", "dbparm", "")
sle_5.text = ProfileString ("timeway.ini", "database", "lock", "")
sle_7.text = ProfileString ("timeway.ini", "database", "prompt", "")
CHOOSE CASE upper(ProfileString ("timeway.ini", "database", "autocommit", ""))
CASE 'TRUE'
sqlca.AutoCommit = TRUE
CASE 'FALSE'
sqlca.AutoCommit = FALSE
END CHOOSE
st_10.text = GLOBAL_VENDOR_NAME
st_11.text = GLOBAL_VENDOR_NAME_E
string ls_add_string,ls_add_string2,string_I,string_J
Integer I,J
ddlb_server_name.SetRedraw(false)
ddlb_server_name.Reset( )
ddlb_database_name.SetRedraw(false)
ddlb_database_name.Reset( )
if FileExists("timeway.ini")=false then
messagebox("問題","資源檔案‘TIMEWAY.INI’未發現!")
// close(w_m_login1)
else
string_J = ProfileString ("timeway.ini", "TW_MRPII", "I", "")
J=integer(string_J)
FOR I=1 TO J
string_I = "servername" + string(I)
ls_add_string = ProfileString ("timeway.ini", "TW_MRPII", string_I, "")
ddlb_server_name.AddItem(ls_add_string)
string_I = "database" + string(I)
ls_add_string2 = ProfileString ("timeway.ini", "TW_MRPII",string_I, "")
ddlb_database_name.AddItem(ls_add_string2)
NEXT
end if
ddlb_server_name.SetRedraw(true)
ddlb_database_name.SetRedraw(true)
ddlb_server_name.selectitem(1)
ddlb_database_name.selectitem(1)
LOGIN_NUMBER = 0
//sle_password.setfocus()
sle_user_name.setfocus()
setpointer(arrow!)
uj5u.com熱心網友回復:
看了ddlb_1.text = ProfileString ("timeway.ini", "database", "dbms", "")ddlb_1的屬性里看到如下 有string Item[]={"ODBC"
inherited from dropdownlistbox
int X=605
int Y=1185
int Width=978
int Height=404
int TabOrder=140
boolean VScrollBar=true
long BackColor=12639424
int TextSize=-9
int Weight=400
string FaceName="Arial"
FontFamily FontFamily=Swiss!
FontPitch FontPitch=Variable!
string Item[]={"ODBC",&
uj5u.com熱心網友回復:
這么老的系統還在用,不容易。趕緊換SAP吧。uj5u.com熱心網友回復:
雖然看到了連接引數,但是引數是沒問題的。不知道為什么連接不了同樣組態檔timeway.ini 我在服務器本機上可以連接,在客戶端就不能連接
問題還是出在服務器那里
我理解的DBMS=MSS (Msoft) SQL Server 6.0 這個方式是 Microsoft SQL Server型別的OLE DB
到底是什么呢?
uj5u.com熱心網友回復:
看一下你的客戶端軟體目錄里面是否有這個檔案。ntwdblib.DLL 沒有的話網上下一個放進來。再試一下。uj5u.com熱心網友回復:
用的IP還是實體名訪問。telnet埠有沒有正常打開。
本機訪問、局域網問、互聯網訪問是有區別的,本機能訪問不能說明其他方式就沒有問題。
uj5u.com熱心網友回復:
用IP和實體名訪問都試過了結果一樣。
局域網問不能訪問
uj5u.com熱心網友回復:
有,版本是6.50.409
uj5u.com熱心網友回復:
今天在一臺客戶端里安裝了PB開發工具各個版本后,就可以連接服務器了,而且不出錯。難道我要每臺客戶端都安裝PB開發工具嗎?這個不現實。。。
uj5u.com熱心網友回復:
PB runtime 工具包,你試試找找瞎子啊或者在PB開始選單中中自己制作一個uj5u.com熱心網友回復:
我現在可以連接的客戶端的PB都是60版本的DLL,復制到其他客戶端后注冊失敗uj5u.com熱心網友回復:
能連接的客戶端還有個必要條件就是,服務器的區域語言和高級選項里必須選英語或日語就可以連接,而且不出錯。或是不改區域語言和高級選項,sql server 的服務器設定里 默認語音改為 英語也可以連接,而且不出錯。
但是其他客戶端還是無法連接
uj5u.com熱心網友回復:
那么老的系統還能運行,厲害啊uj5u.com熱心網友回復:
確實挺強的,客戶端到win7還能正常運行很不錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/14788.html
標籤:數據庫相關
上一篇:powerbuilder 寫出來的程式 出現陣列越界問題,剛重啟電腦時打開沒問題,有時候電腦上打開的程式多了,打開
