避開使用DSN連接數(shù)據(jù)庫(kù)
發(fā)表時(shí)間:2024-01-06 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]是否仍舊在使用ODBC系統(tǒng)或文件DSN連接數(shù)據(jù)庫(kù)?請(qǐng)用OLEDB提供者代替它,這是一種速度更快而且不需要使用DSN的數(shù) 據(jù)庫(kù)連接技術(shù)。使用OLEDB提供者,你不必再為了創(chuàng)建系統(tǒng)DSN懇求ISP(或數(shù)據(jù)庫(kù)管理員/網(wǎng)站管理員),也不必為了網(wǎng)站 文件位置的變化而修改配置。 問(wèn): 我看到過(guò)大量通過(guò)數(shù)據(jù)...
是否仍舊在使用ODBC系統(tǒng)或文件DSN連接數(shù)據(jù)庫(kù)?請(qǐng)用OLEDB提供者代替它,這是一種速度更快而且不需要使用DSN的數(shù)
據(jù)庫(kù)連接技術(shù)。使用OLEDB提供者,你不必再為了創(chuàng)建系統(tǒng)DSN懇求ISP(或數(shù)據(jù)庫(kù)管理員/網(wǎng)站管理員),也不必為了網(wǎng)站
文件位置的變化而修改配置。
問(wèn):
我看到過(guò)大量通過(guò)數(shù)據(jù)資源名字(DSN)連接數(shù)據(jù)庫(kù)的例子,不過(guò)我現(xiàn)在想不通過(guò)DSN連接數(shù)據(jù)庫(kù)。在ASP中可以實(shí)現(xiàn)
這一點(diǎn)嗎?能否舉幾個(gè)具體的例子說(shuō)明?我希望新的連接方法不依賴于系統(tǒng)DSN,但又可以在數(shù)據(jù)庫(kù)連接串中指定驅(qū)動(dòng)程
序、服務(wù)器名字、數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)賬號(hào)和密碼。
答:
如果你使用的是SQL Server 7,請(qǐng)使用下面的數(shù)據(jù)庫(kù)連接串:
strConnString = "DSN='';DRIVER={SQL SERVER};" & _
"UID=myuid;PWD=mypwd;" & _
"DATABASE=MyDb;SERVER=MyServer;"
其中最重要的參數(shù)在于“DRIVER=”部分。如果你希望繞過(guò)ODBC,直接通過(guò)OLEDB訪問(wèn)SQL Server(一般來(lái)講這種方法
速度更快),請(qǐng)使用下面這種連接串:
strConnString ="Provider=SQLOLEDB.1;Password=mypassword;" & _
"Persist Security Info=True;User ID=myuid;" & _
"Initial Catalog=mydbname;" & _
"Data Source=myserver;Connect Timeout=15"
如果你要使用數(shù)據(jù)庫(kù)連接串,但又不熟悉OLEDB提供者的連接串語(yǔ)法,請(qǐng)使用Visual Basic的數(shù)據(jù)環(huán)境設(shè)計(jì)器或ADO數(shù)
據(jù)控件創(chuàng)建一個(gè),然后把它拷貝出來(lái)用于ADO連接對(duì)象就可以了。在立即窗口中,輸入命令?
dataenvironment1.connection1.ConnectionString可以得到連接串的代碼。請(qǐng)注意Microsoft Access連接串的語(yǔ)法有所不
同,參見(jiàn)《Syntax for DSN-Less Connection for MS Access》
參見(jiàn):《ASP性能優(yōu)化指南》中的數(shù)據(jù)庫(kù)連接部分。
2、記錄集中記錄總數(shù)的計(jì)算
1062
剛開始在ASP頁(yè)面中使用記錄集的時(shí)候可能經(jīng)常會(huì)遇到這個(gè)問(wèn)題。如果你想訪問(wèn)記錄集中的數(shù)據(jù),首先必須保證記錄
集中確實(shí)包含數(shù)據(jù)。請(qǐng)記住,如果記錄集中沒(méi)有數(shù)據(jù),系統(tǒng)將顯示非常不友好的運(yùn)行時(shí)錯(cuò)誤信息。你可以使用下面的代碼
去解決這種問(wèn)題。
問(wèn):
我已經(jīng)有數(shù)年的VB經(jīng)驗(yàn),但剛剛開始學(xué)習(xí)ASP和VBScript,F(xiàn)在我要打開一個(gè)Access數(shù)據(jù)庫(kù),計(jì)算其中的記錄總數(shù)并
在Web頁(yè)面中顯示這些信息。數(shù)據(jù)庫(kù)的名字叫sean.mdb,其中包含一個(gè)people表,表中有三個(gè)記錄。然而,當(dāng)我運(yùn)行腳本時(shí)
它總是說(shuō)有-1個(gè)記錄。
是否可以告訴我下面的代碼什么地方出錯(cuò)了?
< %
Set objConn = Server.CreateObject("ADODB.Connection")
Set objRst = Server.CreateObject("ADODB.Recordset")
objConn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=
" & Server.Mappath("seannewelldbsean.mdb"))
strSQL = "SELECT * FROM people"
objRst.Open strSQL, objConn
Response.write( "< P >" & strSQL & "< /P >" )
Response.write("< H2 >There are " & objRst.RecordCount &
" People in the database< /H2 >")
If objRst.RecordCount > 0 Then
objRst.MoveFirst
Do While Not objRst.EOF
Response.write( "Name = " & objRst.fields(0) )
objRst.MoveNext
Loop
else
Response.write( "It's EMPTY!" )
End If
objRst.Close
Set objRst = Nothing
objConn.Close
Set objConn = Nothing
% >
答:
在低版本的MDAC中RecordCount屬性返回-1。請(qǐng)?jiān)谀愕姆⻊?wù)器上把MDAC文件更新到最新的版本,最新的MDAC文件可以
在www.microsoft.com/data找到。
如果Web服務(wù)器由ISP管理而你又無(wú)權(quán)配置它,無(wú)法升級(jí)MDAC文件,那么必須修改代碼。
原來(lái)使用下面的代碼檢查記錄集中是否有記錄:
If objRst.RecordCount > 0 Then ...
請(qǐng)改用下面的代碼:
If objRst.BOF and objRst.EOF Then
' 記錄集為空
Else
Do While not objRst.EOF
' 處理記錄集
objRst.MoveNext
Loop
End If
2000年06月30日更新,新西蘭的Daryl Egarr說(shuō):
可以看出,讀者提問(wèn)中的代碼并沒(méi)有錯(cuò)誤。問(wèn)題在于“在低版本的MDAC中RecordCount屬性返回-1”,這一判斷本身
并沒(méi)有錯(cuò)誤,然而從提問(wèn)內(nèi)容來(lái)看作者不應(yīng)該作出這種假定,因?yàn)樵瓎?wèn)題中沒(méi)有任何一行代碼意味著使用了低版本的
MDAC。
作者考慮問(wèn)題的方向不對(duì),問(wèn)題的要點(diǎn)在于并非所有的游標(biāo)類型都支持所有的屬性和方法(不管采用哪種數(shù)據(jù)庫(kù)系
統(tǒng))。問(wèn)題中代碼出現(xiàn)錯(cuò)誤的真正原因在于使用默認(rèn)的CursorLocation時(shí):
Recordset.CursorLocation = adUseServer
RecordCount屬性只有在記錄集的CursorType為1或者3(即adOpenKeyset,adOpenStatic)時(shí)才是可用的。出現(xiàn)錯(cuò)誤
的代碼沒(méi)有指定CursorType,也就是使用了0類型的游標(biāo)(即adOpenForwardOnly,這是速度最快的游標(biāo)類型),此時(shí)對(duì)
RecordCount的引用將一直返回0。
解決問(wèn)題的方法很簡(jiǎn)單,只要把原來(lái)代碼中的:
objRst.Open strSQL, objConn
改成:
objRst.Open strSQL, objConn ,1