在編寫資料庫應用程式的時候,我們可以通過sql語句來動態建立、修改資料庫以及其中的對象。本文我就向大家介紹如何運用visual c#來動態操作sql server資料庫,其中包括如何建立一個sql server資料庫以及如何建立其中的表、預存程序、視圖、索引之類的資料庫物件。本文還介紹了如何動態地修改表的模式,如何從表、預存程序以及視圖中讀取資料並顯示在應用程式的資料庫控制項中。
我們知道sql語句在操作資料庫時運用得最多的是select、insert、update和delete等對於資料的操作,而本文重點向大家介紹的是對於資料庫及其對象的操作。通過掌握這些基本的操作方法,讀者就可以更加靈活地進行資料庫應用程式的開發。
開發執行個體及步驟
1.介面設計:
本文向大家介紹一個運用visual c#動態操作資料庫的執行個體,執行個體的介面1所示。
圖1
從可知,我們的執行個體程式只包含了10個按鈕控制項以及一個datagrid控制項。按鈕控制項分為三類:
第一類為建立資料庫以及資料庫物件的按鈕;
第二類為查看不同資料庫物件中的資料的按鈕;
第三類則為修改資料庫物件的按鈕。其中的datagrid控制項則是用於顯示資料的。
2.添加引用及資料成員:
設計完介面,我們就可以開始編寫程式碼。首先是為我們的程式添加必要的引用以及一些資料成員。因為我們的程式涉及到資料庫的訪問操作,所以必須要運用到資料提供者(data provider)的對象。在.net架構下,我們主要運用的資料提供者分為兩類,一類是sql類型的,另一類是oledb類型的。它們涉及到的命名空間分別為system.data.sqlclient和system.data.oledb。因為我們的程式訪問的是sql server資料庫,所以我們運用的資料提供者對象應為sql類型的。原因很簡單,該類型的對象是專門為sql server資料庫而設計的,所以效能得到了大大的最佳化。所以,在我們的程式的開始處添加如下一句語句:
using system.data.sqlclient; |
添加對system.data.sqlclient命名空間的引用後,我們接下來為程式添加一些必要的資料成員,這些資料成員為我們的類的私人成員,通過它們我們可以完成一些對資料庫及其對象的操作。
private string connectionstring = "integrated security=sspi;initial catalog=;data source=localhost;"; private sqlconnection conn = null; private sqlcommand cmd = null; private string sql = null; |
至於各個資料成員的意義,我想大家一看就應該會明白了,所以這裡就不多說了。
3.處理資料庫連接對象:
對於資料庫應用程式而言,串連到相應的資料庫是一個必不可少的步驟,我們的程式也不例外。所以在我們的程式的建構函式中得先建立一個資料庫連接對象,方法如下:
public form1() { // // windows 表單設計器支援所必需的 // initializecomponent(); // 建立一個串連 conn = new sqlconnection(connectionstring); } |
這樣,我們在以後的對於資料庫的操作中就可以運用該資料庫連接對象了。
而同時,在我們的程式結束時,我們有必要關閉該資料庫連接對象,否則可能會引發一些意想不到的錯誤。所以得在程式的已重載的dispose函數中添加關閉資料庫連接對象的語句,不過由於.net架構具有自動記憶體回收(garbage collection)功能,所以我們不必像在c++語言中那樣顯式的將該對象銷毀。具體方法如下:
protected override void dispose( bool disposing ) { // 程式運行完畢,確保資料庫連接已經關閉 if (conn.state == connectionstate.open) conn.close(); if( disposing ) { if (components != null) { components.dispose(); } } base.dispose( disposing ); } |
4.建立sql server資料庫:
在建立了資料庫連接對象後,我們就可以在程式中運用它了。首先,我們在程式中動態地建立一個sql server類型的資料庫。我們將資料庫建立在c:\mysql目錄下,所以讀者要練習該執行個體的話得先在c:下建立一個名為mysql的檔案夾,否則會出錯!建立資料庫的關鍵是函數中的sql對象,通過該對象我們指定了資料庫檔案的一些基本屬性。之後,我們新建立了一個sqlcommand對象,通過該對象我們就實際完成了對資料庫的操作。函數的實現如下:
private void button1_click(object sender, system.eventargs e) { // 開啟資料庫連接 if( conn.state != connectionstate.open) conn.open(); string sql = "create database mydb on primary" +"(name=test_data, filename = ''c:\\mysql\\mydb_data.mdf'', size=3," +"maxsize=5, filegrowth=10%)log on" +"(name=mydbb_log, filename=''c:\\mysql\\mydb_log.ldf'',size=3," +"maxsize=20,filegrowth=1)"; cmd = new sqlcommand(sql, conn); try { cmd.executenonquery(); } catch(sqlexception ae) { messagebox.show(ae.message.tostring()); } } |
5.建立表並添加記錄:
建立了資料庫後,我們得為其建立表,表是資料庫中的基本對象。我們通過create table這句sql陳述式完成建立表的操作,表被建立後,我們就確定了其模式(schema)。之後,我們還通過insert語句向該表中添加了四條記錄以為後用。函數的實現如下:
private void button2_click(object sender, system.eventargs e) { // 開啟資料庫連接 if( conn.state == connectionstate.open) conn.close(); connectionstring ="integrated security=sspi;" + "initial catalog=mydb;" + "data source=localhost;"; conn.connectionstring = connectionstring; conn.open(); sql = "create table mytable"+ "(myid integer constraint pkeymyid primary key,"+ "myname char(50), myaddress char(255), mybalance float)"; cmd = new sqlcommand(sql, conn); try { cmd.executenonquery(); // 向表中添加記錄 sql = "insert into mytable(myid, myname, myaddress, mybalance) "+ "values (1001, ''puneet nehra'', ''a 449 sect 19, delhi'', 23.98 ) " ; cmd = new sqlcommand(sql, conn); cmd.executenonquery(); sql = "insert into mytable(myid, myname,myaddress, mybalance) "+ "values (1002, ''anoop singh'', ''lodi road, delhi'', 353.64) " ; cmd = new sqlcommand(sql, conn); cmd.executenonquery(); sql = "insert into mytable(myid, myname, myaddress, mybalance) "+ "values (1003, ''rakesh m'', ''nag chowk, jabalpur m.p.'', 43.43) " ; cmd = new sqlcommand(sql, conn); cmd.executenonquery(); sql = "insert into mytable(myid, myname, myaddress, mybalance) "+ "values (1004, ''madan kesh'', ''4th street, lane 3, delhi'', 23.00) " ; cmd = new sqlcommand(sql, conn); cmd.executenonquery(); } catch(sqlexception ae) { messagebox.show(ae.message.tostring()); } } |
完成此操作後,我們可以在原生sql sever企業管理器中開啟mydb資料庫並找到該表。圖2顯示了該表的設計圖示:
圖2
6.建立通用sql語句執行函數:
考慮到程式後面大量運用sqlcommand對象對資料庫進行操作,我們在程式中設計了一個通用的sql語句執行函數。它根據資料庫連接對象以及sql對象建立一個sqlcommand對象,然後完成對資料庫的相關操作。函數的實現如下:
private void executesqlstmt(string sql) { // 開啟資料庫連接 if( conn.state == connectionstate.open) conn.close(); connectionstring ="integrated security=sspi;" + "initial catalog=mydb;" + "data source=localhost;"; conn.connectionstring = connectionstring; conn.open(); cmd = new sqlcommand(sql, conn); try { cmd.executenonquery(); } catch(sqlexception ae) { messagebox.show(ae.message.tostring()); } } |
7.建立預存程序:
我們通過create procedure這句sql語句建立預存程序,同時函數中還調用了上面的通用sql語句執行函數。函數的實現如下:
private void button3_click(object sender, system.eventargs e) { sql = "create procedure myproc as"+ " select myname, myaddress from mytable go"; executesqlstmt(sql); } |
預存程序建立完畢後,我們可以在sql server企業管理器中找到其屬性,3所示。
圖3
8.建立視圖:
建立視圖的過程與上面建立預存程序的方法類似,只是運用到的sql語句為create view。函數的實現如下:
private void button4_click(object sender, system.eventargs e) { sql = "create view myview as select myname from mytable"; executesqlstmt(sql); } |
同樣,在建立完成後,我們可以在企業管理器中找到其屬性,4所示。