標籤:
轉自:http://www.cnblogs.com/hackhu/archive/2007/11/27/974135.html
在BETA2中,。NET提供了以下的NAMESPACE:
System.Data Namespace
System.Data.OleDb (和BETA1中已經不同了,所以如果拿BETA1中的程式到BETA2中來運行肯定不可以的)
如果想講清楚這些東西,我不認為是我可以作到的,所以我想通過一些具體的程式來把我們對資料庫的最基本的操作(SELECT、UPDATE、DELETE、INSERT等)示範一下,其他的還是需要朋友們在學習過程中來慢慢體會了!
要想操作一個資料庫,不論是那種操作,首先要做的肯定是開啟資料庫,下面我們以ACCESS資料庫來做例子說明如何開啟一個資料庫連接!在這裡我們需要用到的是:System.Data.OleDb.OleDbConnection類!(如果操作SQL資料庫,我們最好使用System.Data.SqlClient.SqlConnection類)
我先寫出我自己使用的程式:
using System.Data
using System.Data.OleDb
public OleDbConnection getConn()
{
string connstr="Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=F:\\web\\notesbook\\class\\leavenotes.mdb";
OleDbConnection tempconn= new OleDbConnection(connstr);
return(tempconn);
}
相信只要使用過ADO的朋友應該都可以看懂的!我們先定義一個String類型的變數,其中存放了我們串連資料庫的連接字串,然後在定義一個System.Data.OleDb.OleDbConnection類型的對象並執行個體化,最後返回這個對象!需要說明一下的是,我並沒有把語句:tempconn.Open();放到這個函數中,原因我我稍後在說明,這裡只是先提醒一下!
通過上面的函數,我們就已經得到了類似於ADO中的連線物件Connection了!下面的就是具體操作資料庫了!
在具體講操作前,我認為有必要先認識一下下面的兩個類:
System.Data.OleDb.OleDbDataAdapter
System.Data.OleDb.OleDbDataReader
System.Data.OleDb.OleDbDataAdapter:可以直接和DataSet聯絡,並操作資料源的,它的功能相對強大一些,因此也比較耗系統資源!
System.Data.OleDb.OleDbDataReader:則有些類似於ADO中的哪個唯讀向前的記錄集,它最常用在只需要依次讀取並顯示資料的時候,相比System.Data.OleDb.OleDbDataAdapter來說,他耗用的系統資源要小!其實,OleDbDataReader能實現的功能,OleDbDataAdapter都可以實現,不過從資源使用率的角度考慮我們應該盡量使用前者!但有些功能,卻是必須使用OleDbDataAdapter才可以實現的!
* SELECT操作!
下面是我的自己在寫測試程式的時候用到了,先列出來看看OleDbDataReader和OleDbDataAdapter是如何操作從資料庫中選擇記錄的:
//通過ID得到當前留言詳細內容.通過STRING型別參數
public Notebook getNoteFromID(string noteid)
{
Notebook tempnote=new Notebook(); //定義傳回值
try
{
OleDbConnection conn = getConn(); //getConn():得到連線物件
string strCom = "Select * from notes where id=" + noteid ;
OleDbCommand myCommand =new OleDbCommand(strCom,conn);
conn.Open();
OleDbDataReader reader;
reader =myCommand.ExecuteReader() ; //執行command並得到相應的DataReader
//下面把得到的值賦給tempnote對象
if(reader.Read())
{
tempnote.id=(int)reader["id"];
tempnote.title=reader["title"].ToString();
tempnote.content=reader["content"].ToString();
tempnote.author=reader["author"].ToString();
tempnote.email=reader["email"].ToString();
tempnote.http=reader["http"].ToString();
tempnote.pic=reader["pic"].ToString();
tempnote.hits=(int)reader["hits"];
tempnote.posttime=(DateTime)reader["posttime"];
}
else //如沒有該記錄,則拋出一個錯誤!
{
throw(new Exception("當前沒有該記錄!"));
}
reader.Close();
conn.Close();
}
catch(Exception e)
{
//throw(new Exception("資料庫出錯:" + e.Message)) ;
}
return(tempnote); //返回Databook對象
}
上面的程式就是通過OleDbDataReader來得到特定的記錄的!其中用到的語句我單獨寫到下面:
OleDbConnection conn = getConn(); //getConn():得到連線物件
string strCom = "Select * from notes where id=" + noteid ; //SQL語句
OleDbCommand myCommand =new OleDbCommand(strCom,conn); //建立OleDbCommand對象
conn.Open(); //注意我在前面說的Open語句在這裡使用到了!
OleDbDataReader reader;
reader =myCommand.ExecuteReader() ; //執行command並得到相應的結果
我在每句話後都加入了說明,其中OleDbConnection conn = getConn();就是通過我前面提到的getConn函數來得到資料庫連接的,其他語句沒有什麼好說的,都很簡單,就不多說了!
我再列一個通過OleDbDataAdapter來得到記錄的常式:
//Getlist():得到當前需要的留言列表
public DataView getNoteList()
{
DataView dataview;
System.Data.DataSet mydataset; //定義DataSet
try
{
OleDbConnection conn = getConn(); //getConn():得到連線物件
OleDbDataAdapter adapter = new OleDbDataAdapter();
string sqlstr="select * from notes order by posttime desc";
mydataset= new System.Data.DataSet();
adapter.SelectCommand = new OleDbCommand(sqlstr, conn);
adapter.Fill(mydataset,"notes");
conn.Close();
}
catch(Exception e)
{
throw(new Exception("資料庫出錯:" + e.Message)) ;
}
dataview = new DataView(mydataset.Tables["notes"]);
return(dataview);
}
這個程式或許有些複雜,同樣的,我還是先把那些關鍵語句列出,並說明:
OleDbConnection conn = getConn(); //通過函數getConn()得到連線物件
OleDbDataAdapter adapter = new OleDbDataAdapter(); //執行個體化OleDbDataAdapter對象
string sqlstr="select * from notes order by posttime desc"; //SQL語句
mydataset= new System.Data.DataSet(); //由於OleDbDataAdapter需要和DataSet結合使用,所以在這裡定義了DataSet對象,其實說OleDbDataAdapter複雜,其實就是因為DataSet的緣故DataSet有些類似於ADO中的recordset 對象,但功能遠遠超過了它,而且它和資料庫是斷開的,並能存放多個記錄集!
adapter.SelectCommand = new OleDbCommand(sqlstr, conn); //設定命令為SelectCommand類型的
adapter.Fill(mydataset,"notes"); //執行,並將結果添加到mydataset中的”notes”表中
conn.Close(); //關閉串連!
在對上面的程式加一些補充說明,由於getNoteLista是得到一系列記錄,並通過控制項DataGrid來做分頁顯示的,所以我返回的是一個DataView類型的對象!
----------------------------------------
上次說了如何在ADO。NET中執行“SELECT”語句,這次我們看看,如何執行“DELETE、UPDATE、INSERT”等語句。
我們這次同樣通過例子來看,其中我們用到了System.Data.OleDb.OleDbCommand類,其實,我們在前面執行SELECT的時候也用到了!
下面我寫出我的程式:
//修改留言本中特定的資料
public Boolean UpdateNote(Notebook note)
{
Boolean tempvalue=false;
string sqlstr=""; //當時在這裡定義,是為了在出現異常的時候看看我的SQL語句是否正確
try
{
//用到了我前面寫的那個得到資料庫連接的函數
OleDbConnection conn = getConn(); //getConn():得到連線物件,
conn.Open();
//確定我們需要執行的SQL語句,本處是UPDATE語句!
sqlstr = "UPDATE notes SET ";
sqlstr += "title=‘" + note.title + "‘,";
sqlstr += "content=‘" + DealString(note.content) +"‘,";
sqlstr += "author=‘" + note.author + "‘,";
sqlstr += "email=‘" +note.email +"‘,";
sqlstr += "http=‘" +note.http +"‘";
//sqlstr += "pic=‘" +note.pic +"‘";
sqlstr += " where id=" + note.id;
//定義command對象,並執行相應的SQL語句
OleDbCommand myCommand = new OleDbCommand(sqlstr,conn);
myCommand.ExecuteNonQuery(); //執行SELECT的時候我們是用的ExecuteReader()
conn.Close();
//假如執行成功,則,返回TRUE,否則,返回FALSE
tempvalue=true;
return(tempvalue);
}
catch(Exception e)
{
throw(new Exception("資料庫更新出錯:" + sqlstr + "\r" + e.Message)) ;
}
}
這個例子是對於特定ID好的記錄進行UPDATE操作,具體解釋我都寫在了程式中,其中的與資料庫有關的語句是try內部的那些!
其實,我們同樣可以通過上面的那種模式執行INSERT、DELETE操作,下面我把我的程式列到下面!
/*刪除特定記錄,通過string類型的ID刪除欄位,在我的程式中,我把這個函數重載了,這樣我們就可以通過INT類型的ID參數來刪除特定的欄位了*/
public Boolean DelNote(string delid)
{
Boolean tempvalue=false;
string sqlstr="";
//串連資料庫
try
{
OleDbConnection conn = getConn(); //getConn():得到連線物件
conn.Open();
sqlstr = "delete * from notes where id=" + delid;
//定義command對象,並執行相應的SQL語句
OleDbCommand myCommand = new OleDbCommand(sqlstr,conn);
myCommand.ExecuteNonQuery();
conn.Close();
//假如執行成功,則,返回TRUE,否則,返回FALSE
tempvalue=true;
return(tempvalue);
}
catch(Exception e)
{
throw(new Exception("資料庫更新出錯:" + sqlstr + "\r" + e.Message)) ;
}
}
細心的朋友們應該能看到,其實這個程式和上面的相比,只是哪個SQL語句不同而已,其他的都基本一樣的!同樣的,我們想在資料庫中插入新的記錄的時候也可以用這樣的方式,程式如下:
//向留言本中添加資料
public Boolean AddNote(Notebook note)
{
Boolean tempvalue=false; //定義傳回值,並設定初值
//下面把note中的資料添加到資料庫中!
try{
OleDbConnection conn = getConn(); //getConn():得到連線物件
conn.Open();
//設定SQL語句
string insertstr="INSERT INTO notes(title, content, author, email, http, pic ,hits,posttime) VALUES (‘";
insertstr += note.title +"‘, ‘";
insertstr += DealString(note.content) + "‘,‘";
insertstr += note.author + "‘,‘";
insertstr += note.email + "‘,‘";
insertstr += note.http + "‘,‘";
insertstr += note.pic + "‘,";
insertstr += note.hits + ",‘";
insertstr += note.posttime +"‘)";
OleDbCommand insertcmd = new OleDbCommand(insertstr,conn) ;
insertcmd.ExecuteNonQuery() ;
conn.Close();
tempvalue=true;
}
catch(Exception e)
{
throw(new Exception("資料庫出錯:" + e.Message)) ;
}
return(tempvalue);
}
//處理資料,在把資料存到資料庫前,先屏蔽那些危險字元!
public string DealString(string str)
{
str=str.Replace("<","<");
str=str.Replace(">",">");
str=str.Replace("\r","<br>");
str=str.Replace("\‘","’");
str=str.Replace("\x0020"," ");
return(str);
}
//恢複資料:把資料庫中的資料,還原成未處理前的樣子
public string UnDealString(string str)
{
str=str.Replace("<","<");
str=str.Replace(">",">");
str=str.Replace("<br>","\r");
str=str.Replace("’","\‘");
str=str.Replace(" ","\x0020");
return(str);
}
我同時列出了兩個函數UnDealString()和DealString( ),他們是對與輸入內容做一些事先的處理和還原工作的!
這幾個程式因為都比較簡單,所以我就不多說了!
其實,我這樣的對資料庫操作也只是ADO。NET中的一部分,而通過DataSet來操作我現在還沒有仔細研究過,所以我也不能寫出什麼東西來,以後的這幾天我就準備好好看看那個東西了,到時候,我還會把我的感受寫出來和大家分享!
在補充一下,我前面用到的程式都是我在寫一個留言本的測試程式時候用到的!如果有朋友有興趣的話,我將貼出我的全部學習代碼!
--------------------------------------------------
第三節 通過OleDbDataAdapte來操作資料庫!
呵呵,朋友好啊!又天亮了,熬了一個晚上,現在頭腦已經不是很清楚了,不過還不想休息!接著說說我們的資料庫操作吧!前面我們已經說了如何操作資料庫,但幾乎全部是通過OleDbCommand和OleDbDataReader來做的,這次我們說說如何通過OleDbDataAdapter來操作資料庫!由於OleDbDataAdapter是DataSet和資料來源之間建立聯絡的一個橋樑,而DataSet我想大家都知道在ADO.NET中所佔的地位,所以知道如何通過它來操作資料庫就是必須的了!
好了,不廢話了!在前面我們已經用到過一次OleDbDataAdapter來執行“SELECT”語句,我門在回憶一次看看那段代碼!(我適當簡化了)
OleDbConnection conn = getConn(); //getConn():得到連線物件
OleDbDataAdapter adapter = new OleDbDataAdapter("select * from notes order by posttime desc",conn);
System.Data.DataSet mydataset = new System.Data.DataSet();; //定義DataSet
adapter.Fill(mydataset,"notes");
conn.Close();
整個過程分以下幾步:
1. 建立資料庫連接(我是通過自己的函數,在前面的文章中有代碼)
2. 執行個體化OleDbDataAdapter對象!
3. 建立一個DataSet對象,執行SQL語句得到的表添加到其中
4. 關閉資料庫連接
通過上面的步驟我們就可以使用DataBind將我們得到的資料繫結到特定的控制項上了!
下面我們看看,如何通過OleDbDataAdapter來執行刪除特定的資料庫記錄!(DELETE)
由於執行刪除、修改、添加都比前面的麻煩,所以我們還是先看常式,然後自己體會一下,程式如下:
//刪除特定記錄,通過string類型的ID刪除欄位
public Boolean DelNote(string delid)
{
Boolean tempvalue=false;
//串連資料庫
try
{
OleDbConnection conn = getConn(); //getConn():得到連線物件
string selectstr = "select * from notes where id=" + delid;
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(selectstr,conn);
//建立OleDbCommandBuilder,必須!
OleDbCommandBuilder mybuilder = new OleDbCommandBuilder(myDataAdapter);
DataSet ds = new DataSet(); //建立DataSet()執行個體
myDataAdapter.Fill(ds,"notes");
//下面的可以簡化,由於我開始是選擇了所有的記錄,所以就用的是集合方式
foreach(DataRow dr in ds.Tables["notes"].Rows)
{
if(dr["id"].ToString().Equals(delid))
{
dr.Delete();
}
}
myDataAdapter.Update(ds,"notes");
//假如執行成功,則,返回TRUE,否則,返回FALSE
conn.Close();
tempvalue=true;
return(tempvalue);
}
catch(Exception e)
{
throw(new Exception("資料庫刪除出錯:" + e.Message)) ;
}
}
這個程式和我們前面用到的刪除常式是執行同樣的功能的,我這裡改成了用myDataAdapter來達到同樣的效果!
要通過myDataAdapter執行delete操作,我們要有下面的幾步:
1. 建立資料庫連接(通過:OleDbConnection conn = getConn();)
2. 執行個體化OleDbDataAdapter對象!此處並沒有用delete語句,而是先用select語句把要刪除的記錄取得
3. 建立一個DataSet對象,並把執行select語句得到的記錄添加到其中
4. 建立OleDbCommandBuilder對象! 並讓它與我們前面的OleDbDataAdapter對象關聯!語句如下:OleDbCommandBuilder mybuilder = new OleDbCommandBuilder(myDataAdapter);
5. 刪除DataSet中包含表的特定記錄
6. 執行OleDbDataAdapter對象的Update命令更新資料庫,語句如下: myDataAdapter.Update(ds,"notes");
7. 關閉資料庫連接
上面步驟中的第4步,我們建立了一個OleDbCommandBuilder對象,注意是必須的!!!我們將它和OleDbDataAdapter關聯起來,監視RowUpdating事件的發生!在我們刪除了指定的記錄後,要通過執行OleDbDataAdapter對象的Update命令來更新資料庫!
其實,上面的結構不僅適合與delete操作,同樣適合insert、update操作的,只要我們把上面的第5步改成相應的動作陳述式就可以的!
備忘:
在ms內建的協助中,它是使用下面的方式:
string mySelectText = "SELECT * FROM Categories ORDER BY CategoryID";
string mySelectConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND_RW.MDB";
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(mySelectText,mySelectConn);
myDataAdapter.DeleteCommand.CommandText="DELETE FROM Categories WHERE CategoryName=‘Produce‘";
myDataAdapter.DeleteCommand.Connection = myDataAdapter.SelectCommand.Connection;
C# 操作ACCESS資料庫