top
Loading...
VisualC#中動態操作SQLServer數據庫

在編寫數據庫應用程序的時候,我們可以通過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所示。

圖4

9.查看表中的數據:

查看表中的數據過程中,我們運用到了ADO.Net中的SqlDataAdapter以及DataSet這兩個重要的對象。其中SqlDataAdapter對象是前面提到的Sql類型的數據提供者對象,它是專門用于SQL Server數據庫的。而DataSet對象則是與數據提供者對象的類型無關的,它適用于任何類型的數據提供者對象,它被包含在System.Data命名空間之中,可謂是ADO.Net體系結構的核心。其數據的訪問模式為非連接模式(Disconnected),即數據從數據庫(或是Xml數據流)中被讀到DataSet對象后,DataSet對象就斷開了原來的連接。在完成一系列操作后,DataSet對象再連接到數據庫并完成數據的更新操作。SqlDataAdapter對象提供了Fill和Update兩個基本的方法以完成數據的讀取和更新操作。

所以下面是函數的實現方法:

private void button5_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(); // 創建數據適配器SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM myTable", conn);  // 創建一個數據集對象并填充數據,然后將數據顯示在DataGrid控件中DataSet ds = new DataSet("myTable");da.Fill(ds, "myTable");dataGrid1.DataSource = ds.Tables["myTable"].DefaultView;}

該操作的結果就是在程序的DataGrid控件中顯示表中的數據,如圖5所示。

圖5

10.查看存儲過程中的數據:

該過程和上面查看表中的數據的過程類似,其中調用的存儲過程就是我們前面創建的那個。函數的實現如下:

private void button6_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();        // 創建數據適配器SqlDataAdapter da = new SqlDataAdapter("myProc", conn);  // 創建一個數據集對象并填充數據,然后將數據顯示在DataGrid控件中DataSet ds = new DataSet("SP");da.Fill(ds, "SP");dataGrid1.DataSource = ds.DefaultViewManager; }

該操作的結果如圖6所示。

圖6

11.查看視圖中的數據:

該過程和上面的兩個過程也是類似的,調用的視圖是我們前面創建的那個視圖。函數的實現如下:

private void button7_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();        // 創建數據適配器SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM myView", conn);  // 創建一個數據集對象并填充數據,然后將數據顯示在DataGrid控件中DataSet ds = new DataSet();da.Fill(ds);dataGrid1.DataSource = ds.DefaultViewManager;}

該操作的結果如圖7所示。

圖7

12.創建其他數據庫對象:

在關系型數據庫中,常涉及到的數據庫對象還包括了索引、約束等。它們是高效實現數據庫查詢操作和滿足數據庫完整性規則的必要條件。我們可以通過Create Index語句來創建索引,通過CREATE RULE語句來創建約束(也即規則)。函數的實現如下:

private void button8_Click(object sender, System.EventArgs e){sql = "CREATE UNIQUE INDEX "+"myIdx ON myTable(myName)";     ExecuteSQLStmt(sql);    sql = "CREATE RULE myRule "+"AS @myBalance >= 32 AND @myBalance < 60";ExecuteSQLStmt(sql); }

13.修改表:

上面我們為數據庫創建了一個表,但是實際的應用過程中可能還要為該表添加一些字段或是刪除某些字段,這就要通過ALTER TABLE這句SQL語句來完成了。其中添加字段的方法是ALTER TABLE…ADD…,而刪除字段的方法則是ALTER TABLE…DROP…,本程序中我們為表添加了一個字段。函數的實現如下:

private void button9_Click(object sender, System.EventArgs e){sql = "ALTER TABLE MyTable ADD "+"newCol TIMESTAMP";                        ExecuteSQLStmt(sql);}

該操作執行完畢后,我們在企業管理器的設計表圖中可以找到相應的變化,如圖8所示。

圖8

14.刪除表:

刪除表的操作就是將某個不再有用的表從數據庫中刪除,通過DROP TABLE語句我們可以完成此操作。函數的實現如下:

private void button10_Click(object sender, System.EventArgs e){string sql = "DROP TABLE myTable";  ExecuteSQLStmt(sql);}

小結

以上,我們通過運用Visual C#動態地創建了一個SQL Server類型的數據庫以及相關的一些數據庫對象并完成了數據的添加和顯示等操作。通過動態地操作該數據庫,我們感覺到了.Net框架下數據庫應用程序編程的簡潔性和方便性,這不得不歸功于ADO.Net的強大功能,所以希望大家能學好ADO.Net以創建出更加靈活多樣、功能強大的數據庫應用程序。最后,希望本文對大家能有不少幫助。

(源代碼為Source.rar)

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗