這兩天弄了幾個VB的小程序。很久沒有接觸過他們了,感覺有些陌生。我有點基礎,基本能解決壹些小問題。但是,這次我真的遇到了壹個問題。只是琢磨了半天也沒個結果,在網上查資料也沒個底,就像大海撈針壹樣。關鍵是沒有認真的回答和可行的方案。
問題是這樣的:在VB中執行壹個存儲過程,並試圖輸出返回值,將數據綁定到DataGrid控件,本來是壹個微不足道的問題,傳了進來。NET和ASP,但是在VB中被折磨了很久。自己動手。有問題就要想辦法壹步壹步來。
先用SQL 2000寫存儲過程(這裏不再寫存儲過程的具體代碼,就是壹個返回值和壹個記錄集),然後引用VB中的ADO對象,輸入下面的代碼調用存儲過程:
Dim lackconn作為新的ADODB。關系
拉克康恩。ConnectionString = Provider = SQL oledb . 1;Persist安全信息= False用戶ID = sa密碼= boyd初始目錄= mydb數據源=(本地)
拉克康恩。“CursorLocation = aduseclient”被設置為客戶端。
拉克康恩。打開
設置lackcmd = New ADODB。命令
lackcmd。ActiveConnection = lackconn
Lackcmd。“CommandText = myproc”這是存儲過程的名稱。
Lackcmd。“commandtype = adcmdstoredproc”被指定為存儲過程。
set param = lack MD . create parameter(@ num,adinger,adparamreturnvalue,4)' @ num為返回值。
lackcmd。參數。附加參數
設置lackrs = New ADODB。記錄集
設置lackrs = lackcmd。執行()
msgbox站點總數:&;lackcmd。參數(@num)。價值與價值。個人
設置mydatagrid。datasource = lacurs的mydatagrid是對象名。
我的數據網格。“刷新”刷新數據網格。
關閉下面的數據庫對象並忽略它。
這樣壹個簡單的代碼在運行時會出錯,指出錯誤是“set mydatagrid”。datasource = lacurs”,錯誤為“對象關閉時不允許操作”。抑郁ing...這哪裏出問題了?我根本沒有關閉數據庫連接,其他內容都沒問題。解了很久,但是壹大早打開電腦,靈機壹動,搞定了。這種現象就總結到這裏,順便記錄下求解過程。
這種現象有幾個原因:
1,數據庫對象連接關閉,肯定會給出錯誤,當然也不能輸出任何結果。這時候只要註意“先用,後關”就可以了。要解決這個問題,只是暫時不要關閉數據庫連接。
2.當返回的記錄為空時,也會報告壹個錯誤。例如下面的代碼
SQL = select * from dbcn where status = ' 0 '
Set rs = conn.Execute(sql)
如果不是rs。那麽EOF
對於m = 1至rs。記錄計數
列表_狀態。AddItem rs(1)和amp(& amprs(2)和amp):& amprs(4)
rs。下壹步
下壹個m
如果…就會結束
如果沒有數據,這裏也會提示這個錯誤。將查詢代碼放入SQL查詢分析器並運行它。果然沒有數據,呵呵。當然,這樣的錯誤是可以通過壹些方法消除或過濾的。
3.這是我這次遇到的問題的中心。我們將註意力轉向存儲過程。的確,在SQL查詢分析器中,存儲過程運行正常,沒有錯誤和數據。但是仔細想想,因為存儲過程可能包含SQL語句影響的行數的信息,也可能導致這樣的情況。
打開存儲過程,並在begin: set nocount on之後添加壹段代碼,以屏蔽此信息。好了,VB中的程序已經可以正常運行了,數據正常。
順便打開查詢分析器中的幫助,查找關於set nocount on的信息,我們會發現這些東西:
====================================
設置NOCOUNT
導致返回的結果不包含受Transact-SQL語句影響的行數的信息。
語法
設置NOCOUNT { ON | OFF }
給…作註解
當SET NOCOUNT為ON時,不返回計數(表示受Transact-SQL語句影響的行數)。當SET NOCOUNT為OFF時,返回計數。
即使SET NOCOUNT為ON,也要更新@@ROWCOUNT函數。
當SET NOCOUNT為ON時,存儲過程中每個語句的DONE_IN_PROC信息將不會發送到客戶端。用微軟的時候?SQL Server?當提供的實用工具執行查詢時,受影響的nn行將不會顯示在Transact-SQL語句(如SELECT、INSERT、UPDATE和DELETE)末尾的查詢結果中。
如果存儲過程中包含的某些語句不返回太多實際數據,則此設置可以顯著提高性能,因為它大大減少了網絡流量。
SET NOCOUNT設置在執行或運行時設置,而不是在分析時設置。
權限
默認情況下,SET NOCOUNT權限授予所有用戶。
例子
以下示例防止在osql實用工具或SQL Server查詢分析器中執行時顯示有關受影響行數的信息。
使用酒吧
去
-顯示計數信息。
選擇au_lname
來自作者
去
使用酒吧
去
-將NOCOUNT設置為ON,不再顯示計數信息。
設置NOCOUNT ON
去
選擇au_lname
來自作者
去
-將SET NOCOUNT重置為OFF。
設置NOCOUNT關閉
去
我們到此為止吧。我覺得MS的幫助會比我說的更專業,更清晰。請參考。