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