Microsoft OLE DB Provider for ODBC Drivers 錯誤'80040e21' 多步驟OLE DB 操作產生錯誤。如果可能,請檢查每個OLE DB 狀態值。沒有工作被完成。
一個網站程序,在添加新聞時出現錯誤
以下是錯誤提示:
Microsoft OLE DB Provider for ODBC Drivers 錯誤'80040e21'
多步驟OLE DB 操作產生錯誤。如果可能,請檢查每個OLE DB 狀態值。沒有工作被完成。
出現這種錯誤的原因是因為我把access連接字串修改為"Driver={Micorsoft Access Driver ()};dbq=" & Server.Mappath(DbPath),而原來的連接字串為"Provier=Microsoft. Jet.OLEDB.4.0;Data source=" & Server.Mappath(DbPath) 時則不會出現這種錯誤。看來這兩種連接access資料庫的方式還是有一定差別的。至少後一種連接方式在容錯性上好一些,但很明顯在規範上是不太正規的。
為了敘述得簡單,我下面把這兩種方式分別叫做provider連結和driver連結。
上述錯誤在修改新聞時卻不會出現。我看了一下程式碼發現在執行新增時,有一個用Excute取得的記錄集未進行關閉。我關閉了一下也無法正確執行。
於是我寫了一段程式碼,又另外設計了一個簡單的表格,發現這時兩種連接方法可以加進去,於是我又將這段程式碼中的表換回原來的,還是不可以執行。難道與表有關?
於是我開始仔細的研究表格,發現原表格有一個自動編號欄位在程式中被賦值了。我記得自動編號是不可以被賦值的呀。於是我把那個表的自動編號一去,結果可以正常執行。
看來用Provider方式連接是可以對自動編號欄位賦值的。
下面說一下另一個地方的差別。
當我使用driver連接時,在頻道設定時出現了一個Null值,但是實際上在資料庫中是有值的,我看了一下這個欄位的資料類型,是備註。那是不是說driver驅動對長的備註支援也不太好呢?不會吧,我那個新聞表中的新聞內容一定是備註的呀,應該不是這方面的原因。
是什麼方面的原因呢?難道是因為他是位於另一個備註的後面?可是新聞表中也有兩個備註並且內容備註也是位於簡介備註的後面呀。這種懷疑也被排除。
是因為這個欄位是有關鍵字的原因?我把這個欄位值改為1,結果也是出錯。
那是什麼方面的原因呢?
乾脆自己再寫一個頁面測試,測試程式碼如下
以下是測試程式碼:
複製代碼代碼如下:
dim conn
set conn=server.createobject("adodb.recordset")
conn.open "driver={Microsoft access driver (*.mdb)};dbq=" & server.mappath("data/dd.mdb") 'driver連線方式
'conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("data/dd.mdb") 'provider連線方式
set rs=conn.execute("select * from s_channel where channelID=11")
response.Write rs("UploadSetting")
rs.close
set rs =nothing
如果發現兩種連接能正常的輸出。
於是我在原始程式碼的剛開啟記錄集的地方輸出(response.write)了一下,發現在那個位置可以正常輸出該欄位的值。於是我把輸出碼不停的往下移動,最後移動到
以下是程式碼片段:
複製代碼代碼如下:
if IsNull(rs("UploadSetting")) or rs("UploadSetting")="" then
UploadSetting=Split("1,2,3,4@Other@2@0@jpg|gif|bmp|png@100@1@swf@500@1@rm|mp3|wav|mid|avi|mpg|mpeg |asf|wma@2048@1@rar|zip|exe|doc|xls|chm@2048@1","@")
else
UploadSetting=Split(rs("UploadSetting"),"@")
end if
放到if上面可以正常的輸出內容,但放到else後面就輸出Null什麼原因呢?
於是最終的測試程式碼如下
以下是測試程式碼:
複製代碼代碼如下:
dim conn
set conn=server.createobject("adodb.recordset")
conn.open "driver={Microsoft access driver (*.mdb)};dbq=" & server.mappath("data/dd.mdb") 'driver連線方式
'conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("data/dd.mdb") 'provider連線方式
set rs=conn.execute("select * from s_channel where channelID=11")
response.Write rs("UploadSetting")
if IsNull(Rs("UploadSetting")) or rs("UploadSetting")="" then
response.Write "dd"
else
response.Write rs("UploadSetting")
end if
rs.close
set rs =nothing
以上程式碼,使用provider方式連接時,能正確輸出rs("uploadSetting")中的值,而在Driver方式下則什麼也不輸出。
我們是不是可以這麼理解:就是在Driver方式下,備註內容的引用只能有一次,而再次引用時則變成NULL值。而Provider則不會出現這種情況。
對於這種情況的適應,我們只能是透過一個變數。讓備註字段的內容先給一個變量,而不是直接引用。