天天看點

ADO.NET + DataGrid的問題

現在寫程式要完全不沾資料庫的邊恐怕很難,那麼用C#寫程式也是一樣,會經常遇到資料庫方面的問題。在C#中操作資料庫是使用ADO.Net來完成,而顯示資料這一方面常常要用到的是DataGrid這個元件,是以這兩個問題也是論壇中問得最多的。   對于ADO.Net 來說,涉及的問題大緻分為如下幾類: 第一類,資料庫的連接配接問題; 第二類,資料庫操作方面的問題,查詢、更新等等; 第三類,對資料集的操作問題; 最後一類,就是前三者的部分綜合或者擴充問題。 對于DataGrid 來說,大多數屬于操作問題,而操作問題會随着應用不同而不同。   這次我寫這篇文章不是給每個問題提出一個解決的方法,因為資料庫方面的問題千奇百怪,會随着不同應用而變化萬千。 與其用一兩個方法來解決部分問題,不如提供一個檢查、分析和處理的整套步驟,進而讓大家來提高自身分析問題和解決問題的能力。   先說說ADO.Net相關問題,首先用它寫程式的時候,要明白各個類是幹什麼。如果你初次接觸ADO.Net,或者對它還不是很了解的話,建議你先看看這篇文章,進而對它有個初步的了解。 http://blog.csdn.net/knight94/archive/2006/04/15/664530.aspx   現在就開始對問題一來進行分析。對于資料庫連接配接所出現的錯誤,基本上有如下兩個原因所造成的。 第一個,連接配接字元串書寫不對; 第二個,所采用的方式不對。 PS: 其實第二點嚴格意義上也應該屬于第一點的範疇。   那麼如何檢查一個連接配接字元串不對呢,其實對于程式設計者來說,當接觸到一個新技術的時候,首先要學會模仿,即參照别人寫的。 那麼對于資料庫連接配接字元串的規範寫法,如下這個網站可以參考。 http://www.connectionstrings.com 這個網站包羅了各種資料庫,對于每種資料庫都提供了不同的連接配接方法。那麼看了别人所寫的連接配接字元串之後,比對自己所寫的,看看有什麼不同。如果想了解各個部分的名詞意思,那我建議你在MSDN中查閱“SqlConnection.ConnectionString”,就可以獲得比較詳細的解釋。等大概領悟後,就要親自動手試着修改自己的連接配接字元串來滿足目前的環境。   對于第二類問題,比較常見的例如,連接配接SQL Server的時候,本應該使用SQL Server認證來連接配接,卻使用了Windows認證。這種情況下,表面上連接配接字元串是對的。那麼如何排除這類錯誤呢,其實比較簡單,你可以用SQL Server提供的工具去按照這種方式進行連接配接,看是否成功,等你發現這種連接配接無法成功的時候,你就知道在設定連接配接字元串的時候出現問題。解決這類問題的辦法,你可以修改連接配接字元串來比對目前環境(其實通過設定資料庫來使目前Windows認證合法,這個方法你可以參考相關資料庫的手冊來完成)。   除此外,當使用檔案作為資料源的時候,要注意檔案路徑是否正确,為了確定能通路到檔案,我建議你在程式中把相對路徑轉化成絕對路徑;其次在Web通路的時候,要設定Aspnet使用者對此目錄具有通路權限等等。   經過如上的分析,對于一個連接配接字元串所産生的問題基本可以解決。   第二類問題,對資料庫操作的問題。 這個問題絕大一部分是由于形成SQL 語句的時候,是采用拼接字元串的做法,這樣會導緻單引号問題,類型轉換問題,空格問題,逗号問題等等,用一句話概括就是SQL 文法錯誤問題。那麼如何最大避免此類錯誤呢,我建議你使用參數,這樣可以是你的SQL語句簡潔,而且容易檢查出文法錯誤。   其次要學會使用工具,對于資料庫軟體來說,一般都提供類似的消息檢查工具,例如:SQL Server所提供的事件探查器(英文為Profiler),它可以捕獲到傳遞到SQL Server的SQL指令,從中你可以檢查到你的語句是否被發送了,如果有問題的話,可以把相關的語句轉到SQL Server提供的查詢分析器中執行,看看具體的錯誤是什麼,然後再傳回來修改你的SQL語句,已達到SQL語句正确地執行。   有人說了,對于簡單點兒的SQL語句還能書寫,稍微複雜點兒的就不會了,這方面的知識沒有系統學過。那麼我建議你抽空補補這方面的知識,同時在機器上裝上SQL Server的幫助文檔,遇到不會寫的SQL語句,檢視幫助你會得到很詳細的說明。而對于SQL語句的練習,可能用程式設計實作反映會比較慢,那麼我建議你使用SQL Server提供的查詢分析器之類的工具。   也就是說,要寫一個資料庫相關的程式,手頭上除了VS 外,還要具有以下工具(以SQL Server 為例): 1. 查詢分析器; 2. 事件探查器(英文為Profiler ); 3. SQL Server 的幫助文檔。 有了這三件工具,基本上與SQL語句相關的問題都能解決。   操作資料庫所産生的問題除了SQL 語句的問題之外,大多數是因為對于ADO.Net 的幾個類使用不合理,這方面的問題建議你看我前面所介紹的文章(關于ADO.Net 基礎的那篇文章)。   對于資料集操作的問題,無非就是過濾,查找或者在原有基礎上産生一個新的資料列等等。   對于過濾,這方面參看DataView這個類就行了,或者說隻要吃透MSDN中對于這個類的構造函數的相關解釋就行了。   對于查找,有兩種方法,對于排序關鍵字的查找,可以使用DataView.Find或者DataView.FindRows,這個僅限于過濾後的查找;而後一種,則比較通用,即DataTable.Select方法。至于這兩種方法的使用細節,參看MSDN相應章節就可以明白。   那麼有人就問了,對資料集的過濾和查找,所能支援的哪些SQL語句呢,這方面在MSDN中檢視“DataColumn.Expression”就可以了解,其中有很詳細的清單。   上面所說的剛好解決了在原有的基礎上産生新的資料列的問題,那麼有時候可能還會遇到統計問題,這方面可以使用“DataTable.Compute”方法來實作。   不過對于資料集中所能提供的SQL 語句和統計方法都很有限,不能産生類似于“group ”之類的複雜語句,那麼遇到這種情況,我建議你直接用SQL 語句操作資料庫來實作。如果用SQL 語句都無法實作的話,那你隻有通過foreach 這種最樸實的方法來做。   對于資料集操作的問題,我不想花太多的語句,因為MSDN對于它們的解釋已經很全面了,是以我這裡隻是提了一下關鍵點,相關的内容需要大家動手去查閱。   最後要說說前三類問題的部分綜合或者擴充問題,這類問題牽扯的範圍就更廣,更面向具體應用。 那麼造成這類問題的原因,有一部分是操作混亂造成的。這時候在解決它的時候,你首先要花一段時間來理清思路,想想完成某項功能的時候,應該先做什麼,後做什麼,步驟之間有什麼關聯,等完全明白了,再去動手編碼。   還有一部分是由于資料庫的設計而造成。這方面從程式方面基本上無法彌補,或許說從程式進行解決隻是暫時性的,而不是長遠性的。比較好的辦法就是完善資料庫的設計。而如何去設計一個合理的資料庫,那我隻能建議你看看資料庫一些相關的書,看看相關的成熟架構。   對于ADO.Net相關的四個問題,我已經基本說完,如何把我所說的真正應用到實際程式設計過程中才是至關重要。   而CSDN 中另一個問得比較多的問題就是關于DataGrid 的問題,涉及到它的問題無非是操作問題或者擴充問題。   我這裡推薦兩個位址,對于VS2003中的DataGrid問題,參看 http://www.syncfusion.com/FAQ/WindowsForms/Default.aspx#44   對于VS2005中的DataGridView問題,參看 http://www.codeproject.com/books/PresentDataDataGridView.asp   對于95%以上的問題,都可以從上面的位址中找到答案。 與此同時需要提醒的一點是,參看别人例子的時候,除了了解外要學會靈活應用,不要問題一變就傻瞪眼*_*。   好了,對于ADO.Net和DataGrid就說到這兒,希望對你有所幫助。