數(shù)據(jù)庫在程序設(shè)計中的地位越來越來高,很有必要掌握這種編程方法。雖然要想在短時間內(nèi)完全掌握數(shù)據(jù)庫編程是很有難度的,但我們可以首先掌握基本的知識,其他的復(fù)雜的技術(shù)其實(shí)是在這些基礎(chǔ)知識上多次迭代而產(chǎn)生的。下面我們來分篇介紹基本的數(shù)據(jù)庫的知識。這里介紹的是ADO.net(ADO和它是差不多的)。
訪問數(shù)據(jù)庫的方法有很多,這里介紹的是ADO.NET技術(shù)。
1. 連接和關(guān)閉數(shù)據(jù)庫
首先要連接數(shù)據(jù)庫,可以通過ADO.NET connection對象來連接數(shù)據(jù)庫。ADO.NET提了
好幾個connection對象,例如:OleDbConnection 對象(用于訪問通過傳統(tǒng)ADO訪問的OLE DB數(shù)據(jù)提供者)和SqlConnection對象(提供隊SQL Server的優(yōu)化訪問)。如果要訪問的數(shù)據(jù)庫是SQL Server就用后一個對象,否則就用前面一個對象。使用連接對象之前必須要包含相應(yīng)的命名空間。
using System.Data.OleDb;
在建立連接對象實(shí)例之前,必須先要填充連接對象的ConnectionString屬性,這個屬性包含了多個參數(shù):
Provider 數(shù)據(jù)庫提供者的名稱
Data Source 數(shù)據(jù)源,即數(shù)據(jù)庫的路徑
User ID 用戶名
Password 密碼
DRIVER 數(shù)據(jù)庫驅(qū)動器的名稱,如果指定了DSN就不要這個參數(shù)了
SERVER 數(shù)據(jù)源服務(wù)器的網(wǎng)絡(luò)名稱
這個屬性初始化的格式是:(假定連接的事Access數(shù)據(jù)庫,數(shù)據(jù)庫文件在C : \temp目錄下)
m_cnADONetConnection.ConnectionString =
@” Provider = Microsoft.Jet.OLEDB.4.0;Data Source = C : \temp\contacts.mdb;
User ID = zlw ;Password = 123456 ”;
其他類型的數(shù)據(jù)庫的提供者信息需查閱相關(guān)資料。
連接對象的屬性設(shè)置好后,就可以創(chuàng)建實(shí)例對象了:
m_cnADONetConnection = new OleDbConnection();
接下來,可以打開數(shù)據(jù)庫了:
m_cnADONetConnection.Open();
數(shù)據(jù)庫使用完畢后要關(guān)閉連接,釋放資源:
m_cnADONetConnection.Close();
m_cnADONetConnection.Dispose();
2.操作數(shù)據(jù)庫
A.使用sqlcommand 和OleDbCommand類來執(zhí)行sql語句。
連接數(shù)據(jù)庫后就可以創(chuàng)建一個語句命令對象,然后執(zhí)行這個語句。
OleDbCommand str = new OleDbCommand(“select * from texts” , m_cnADONetConnection);
Str.ExecuteScalar(); //執(zhí)行這個語句
oleDbDataReader daOle = Str.ExecuteReader(); //返回對象
daOle.FieldCount; //返回查詢結(jié)構(gòu)當(dāng)前行的列數(shù)
daOle.GetString(i); //返回當(dāng)前行第i列的字符串形式
daOle.Read(); // 前進(jìn)到下一條記錄
Sql語句的執(zhí)行函數(shù)有很多種 , 其中最有用的是ExecuteReader()這個函數(shù),這個函數(shù)返回一個OleDbDaraReader類對象,這個對象包含語句的查詢結(jié)果,其中有很多方法可以對數(shù)據(jù)進(jìn)行操作。
B.對數(shù)據(jù)庫進(jìn)行操作,最好的方法是創(chuàng)建DataTable對象,這個對象是數(shù)據(jù)源中數(shù)據(jù)的一個快照,可以先對DataTable進(jìn)行操作,然后再將修改的快照返回數(shù)據(jù)庫,以實(shí)現(xiàn)數(shù)據(jù)的更新。
在使用DataTable之前先要填充這個對象,這里利用DataAdapter的Fill方法。先構(gòu)造對象:
OleDbDataAdapter m_daDataAdapter = new OleDbDataAdapter
(“Select * From Contacts” ,
m_cnADONetConnection);
參數(shù)1指定拷貝到DataTable中的數(shù)據(jù),參數(shù)2指定連接對象。
為了使DataTable能對數(shù)據(jù)進(jìn)行操作,此時還應(yīng)該建立一個CommandBuilder對象,這個對象建立后,并不用主動調(diào)用它,只要將它和DataAdapter關(guān)聯(lián)起來,就可以在幕后對數(shù)據(jù)進(jìn)行操作了。
OleDbCommandBuilder m_cbCommandBuilder = new
OleDbCommandBuilder(m_daDataAdapter);
準(zhǔn)備工作完成后就應(yīng)該創(chuàng)建并填充DataTable了:
DataTable m_dtContacts = new DataTable();
m_daDataAdapter.Fill(m_dtContacts);
DataTable可以看成是一個集合,我們可以通過它來直接操作數(shù)據(jù)庫中的表。如:
訪問指定行中的指定列的數(shù)據(jù),可以通過語句:
m_dtContacts[“行號”][“列名”] = “” ; //j將指定位置的數(shù)據(jù)修改
字符串變量 = m_dtContacts[“行號”][“列名”] ; //取得指定位置的數(shù)據(jù)
//在表中增加一行
DataRow drNewRow = m_dtContacts.NewRow();
drNewRow[“第一列名”] = str ;
drNewRow[“第二列名”] = str;
……
m_dtContacts.Rows.Add(drNewRow) ;
//刪除一行
m_dtContacts.Rows[“行號”].Delete();
在對內(nèi)存數(shù)據(jù)庫DataSet進(jìn)行修改處理后必須調(diào)用下面語句,才能反映到物理數(shù)據(jù)庫中:
m_daDataAdapter.Update(m_dtContacts) ;
上面介紹的修改是通過修改DataSet,然后同步物理數(shù)據(jù)庫的修改。還有一種方法是通過修改物理數(shù)據(jù)庫,然后同步DataSet。這種方法是通過SQL語句來修改物理數(shù)據(jù)庫,然后更新DataSet來同步。具體代碼為:
string strDele = "DELETE FROM Contacts where 條件 ;
OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ;
file://從數(shù)據(jù)庫中刪除指定記錄
myCommand.ExecuteNonQuery ( ) ; // 執(zhí)行SQL語句
file://從DataSet中刪除指定記錄 ,同步操作
myDataSet.Tables [ " Contacts " ] . Rows [ 行號 ] . Delete ( ) ;
myDataSet.Tables [ " Contacts " ] . AcceptChanges ( ) ;
3.綁定數(shù)據(jù)庫
在c#中任何一個從Control類派生來的類均可以綁定數(shù)據(jù)源。綁定數(shù)據(jù)源必須要用到DataSet,這個類和DataTable類的區(qū)別就像數(shù)據(jù)庫中表和數(shù)據(jù)庫的區(qū)別,一個DataSet可以包含多個DataTable,在我們用DataAdapter填充DataTable時,也可以填充DataSet,其語法為:
DataSet ds = new DataSet();
m-daDataAdapter。Fill(ds , “Contacts”); // Contacts是ds關(guān)聯(lián)的表名
在有了ds后就可以進(jìn)行數(shù)據(jù)的綁定了
textBox1.DataBindings.Add ( "Text" , ds , "Contacts。列名" ) ;
這句代碼將表Contacts中的某列的當(dāng)前行綁定在textBox1上。“Text”是數(shù)據(jù)類型。
使用這種方法也可以將表中某列綁定到其他的簡單控件上。
當(dāng)要將數(shù)據(jù)綁定到復(fù)雜控件上,必須使用以下代碼:
ComboBox1.DataSource = ds ;
ComboBox1.DisplayMember = " Contacts。列名" ;
ComboBox1.ValueMember = " Contacts。列名" ;
這種綁定將一列綁定在了ComboBox1上了,我們也可以使用上面的方法將某列中的某行綁定在ComboBox1上。
在控件的容器Form中還有一個BindingManagerBase類對象,這個對象是用來關(guān)聯(lián)關(guān)聯(lián)到此窗口的DataSet的,利用下面語句可以關(guān)聯(lián)這兩個對象:
BindingManagerBase bmb = this . BindingContext [ ds , "Contacts" ] ;
現(xiàn)在可以利用bmb來操作ds,其中bmb中的Position成員是用來指定ds表中的當(dāng)前行的,可以對它進(jìn)行賦值,改變ds表的當(dāng)前行,這樣可以改變綁定到此ds的空間中顯示的值。
對于DataSet和DataTable是我們在內(nèi)存中建立的數(shù)據(jù)庫表的拷貝,其實(shí)沒有數(shù)據(jù)庫我們也可以在內(nèi)存中建立一個這樣的快照,其語法為:
DataSet ds = new DataSet(); // 建立一個空數(shù)據(jù)庫
DataTable dt = ds2.Tables.Add("mdb"); //建立一張表
dt.Columns.Add("01", typeof(string)); //添加一列
dt.Columns.Add("02", typeof(string)); //再添加一列
DataRow dr2 = ds2.Tables["mdb"].NewRow(); //添加一個新行
dr2[0] = "1"; //為行賦值
dr2[1] = "2";
ds2.Tables["mdb"].Rows.Add(dr2) ; //將行添加到表中