注意:本文暫時(shí)不講解
數(shù)據(jù)庫(kù)
的數(shù)據(jù)調(diào)出和顯示,因?yàn)樗婕暗臇|西比較多,所以我們將另外詳細(xì)講解。本文主要要講的是數(shù)據(jù)庫(kù)的增加、刪除、修改。
一、定義
OleDbCommand
類型變量:
MyCommand
要對(duì)數(shù)據(jù)庫(kù)進(jìn)行增加、刪除、修改的操作我們還需要根據(jù)
MyConnectio
的類型定義一個(gè)
OleDbCommand
或者
SqlCommand
對(duì)象(請(qǐng)注意如果
MyConnection
是
OleDbConnection
類型,那么只能用
OleDbCommand
;如果
MyConnection
是
SqlConnection
類型,那么那么只能用
SqlCommand
。這里假設(shè)
MyConnection
是
OleDbConnection
類)。(方法一)你可以象拖放
MyConnection
一樣拖放一個(gè)
OleDbCommand
,并命名為
MyCommand
。(方法二)在
(
關(guān)聯(lián)文件
).CS
文件中
protected System.Data.OleDb.OleDbConnection MyConnection;
下面手動(dòng)添加:
protected System.Data.OleDb.OleDbCommand MyCommand;
在
private void InitializeComponent()
中
this.MyConnection = new System.Data.OleDb.OleDbConnection();
的下一行下面手動(dòng)添加:
this.MyCommand = new System.Data.OleDb.OleDbCommand();
即可完成對(duì)
MyCommand
的定義
說(shuō)明:
MyCommand
的作用是用來(lái)執(zhí)行
SQL
命令
二、利用定義的
MyConnectio
和
MyCommand
對(duì)數(shù)據(jù)庫(kù)進(jìn)行增加、刪除、修改
首先我們需要連接并打開(kāi)一個(gè)數(shù)據(jù)庫(kù)(關(guān)于數(shù)據(jù)庫(kù)的連接和打開(kāi)的操作請(qǐng)察看我們以前的文章)。打開(kāi)數(shù)據(jù)庫(kù):
MyConnectio.Open();
然后我們需要給
MyCommand
指定要執(zhí)行的
SQL
命令
: MyCommand.CommandText = "delete from admin";
接著我們需要給
MyCommand
指定數(shù)據(jù)源(對(duì)那個(gè)數(shù)據(jù)庫(kù)執(zhí)行
SQL
命令):
MyCommand.Connection = MyConnection;
然后我們執(zhí)行
MyCommand
命令即可
: MyCommand. ExecuteNonQuery();
如果我們?cè)趫?zhí)行還有
"delete from admin";
后需要接著執(zhí)行
“
insert into admin (Admin_Code,Admin_Pwd) values(
‘
aa
’
,
’
bb
’
)
”,則我們只要再次指定
MyCommand
指定要執(zhí)行的
SQL
命令
: MyCommand.CommandText =
“
insert into admin (Admin_Code,Admin_Pwd) values(
‘
aa
’
,
’
bb
’
)
”,然后執(zhí)行
MyCommand. ExecuteNonQuery();
即可。(由于數(shù)據(jù)庫(kù)未關(guān)閉,所以我們不需要也不可以再次
MyConnectio.Open();
,同理由于沒(méi)有改變
MyCommand
的數(shù)據(jù)源所以我們也沒(méi)有必要再次指定
MyCommand.Connection = MyConnection;
)
下面我們將詳細(xì)講解如何在
Page_Load()
中對(duì)數(shù)據(jù)庫(kù)的增加、刪除、修改,最后我們?cè)賮?lái)總結(jié)一下
ExecuteNonQuery(),ExecuteScalar(),ExecuteReader
的用法
--------------------------------------------------------------
1
、
增加新的記錄
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();
’打開(kāi)數(shù)據(jù)庫(kù)
MyCommand1.CommandText = "insert into admin values(
‘
aaddq
‘
,
‘
as
‘
,
‘
ss
‘
)";
MyCommand1.Connection = MyConnection;
MyCommand1.ExecuteNonQuery();
’由于增加了一條記錄,所以返回
1
//
或者
MyCommand1.ExecuteReader();
先增加一條記錄,然后返回一個(gè)
System.Data.OleDb.OleDbDataReader
類型的對(duì)象,該對(duì)象為
:EOF
//
或者
MyCommand1. ExecuteScalar();
先增加一條記錄,返回未實(shí)列化的對(duì)象
MyConnection.Close();
}
-------------------------------------------------------------------
2
、
刪除現(xiàn)有數(shù)據(jù)
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();
’打開(kāi)數(shù)據(jù)庫(kù)
MyCommand1.CommandText = "delete * from admin";
MyCommand1.Connection = MyConnection;
MyCommand1.ExecuteNonQuery();
’由于刪除了
n
條記錄,所以返回
n
//
或者
MyCommand1.ExecuteReader();
先刪除
n
條記錄,然后返回一個(gè)
System.Data.OleDb.OleDbDataReader
類型的對(duì)象,該對(duì)象為
:EOF
//
或者
MyCommand1. ExecuteScalar();
先刪除
n
條記錄,返回未實(shí)列化的對(duì)象
MyConnection.Close();
}
------------------------------------------------------------
3
、
修改現(xiàn)有數(shù)據(jù)
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();
’打開(kāi)數(shù)據(jù)庫(kù)
MyCommand1.CommandText = "update admin set admin_code=
’
212
’
,Admin_pwd=
’
43
’
where admin_code=
’
23
’
";
MyCommand1.Connection = MyConnection;
MyCommand1.ExecuteNonQuery();
’由于修改了
1
條記錄,所以返回
n
//
或者
MyCommand1.ExecuteReader();
先修改了
1
條記錄,然后返回一個(gè)
System.Data.OleDb.OleDbDataReader
類型的對(duì)象,該對(duì)象為
:EOF
//
或者
MyCommand1. ExecuteScalar();
先修改了
1
條記錄,返回未實(shí)列化的對(duì)象
MyConnection.Close();
}
三、關(guān)于
MyCommand
的
ExecuteNonQuery(),ExecuteScalar(),ExecuteReader
方法的區(qū)別
:
1
、
ExecuteNonQuery():
執(zhí)行
SQL
,返回一個(gè)整型變量,如果
SQL
是對(duì)數(shù)據(jù)庫(kù)的記錄進(jìn)行操作,那么返回操作影響的記錄條數(shù),如果是
SQL="CREATE TABLE LookupCodes (code_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, code_desc varchar(50) NOT NULL)"
那么在表創(chuàng)建成功后該方法返回
–
1
。
例如:
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();
’打開(kāi)數(shù)據(jù)庫(kù)
MyCommand1.CommandText = "CREATE TABLE LookupCodes (code_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, code_desc varchar(50) NOT NULL)"
;
MyCommand1.Connection = MyConnection;
MyCommand1.ExecuteNonQuery();
’首先建立一個(gè)
LookupCodes
表,然后返回
-1
//
或者
MyCommand1.ExecuteReader();
首先建立一個(gè)
LookupCodes
表,然后返回一個(gè)
System.Data.OleDb.OleDbDataReader
類型的對(duì)象,該對(duì)象為
:EOF
//
或者
MyCommand1. ExecuteScalar();
首先建立一個(gè)
LookupCodes
表,返回未實(shí)列化的對(duì)象
MyConnection.Close();
}
2
、
ExecuteScalar()
:執(zhí)行
SQL
,(如果
SQL
是查詢
Select
)返回查詢結(jié)果的第一行第一列,如果(如果
SQL
不是查詢
Select
)那么返回未實(shí)列化的對(duì)象,因?yàn)閷?duì)象未實(shí)列化,所以返回結(jié)果不能
ToString(),
不能
Equals(null)
,也就是說(shuō)返回結(jié)果沒(méi)有任何作用
3
、
executeReader
方法執(zhí)行
SQL
,(如果
SQL
是查詢
Select
)返回查詢結(jié)果的集合,類型是
System.Data.OleDb.OleDbDataReader
,你可以通過(guò)此結(jié)果,獲取查詢的數(shù)據(jù)。如果(如果
SQL
不是查詢
Select
)那么返回一個(gè)沒(méi)有任何數(shù)據(jù)的
System.Data.OleDb.OleDbDataReader
類型的集合
(EOF)
四、總結(jié):
ASP.Net
中對(duì)于數(shù)據(jù)庫(kù)的操作方法很多,要實(shí)現(xiàn)統(tǒng)一個(gè)目標(biāo)不同的人可能會(huì)采取不同的方法,就好像在
ASP
中有的人喜歡用
RS.ADDNEW
,有的人喜歡用”
Insert Into
”,主要是看個(gè)人的習(xí)慣,當(dāng)然在性能上不同的方法可能會(huì)存在較大的差別,這個(gè)只能靠我們?cè)谄匠5膶W(xué)習(xí)中一點(diǎn)一滴的積累經(jīng)驗(yàn)的。另外順便說(shuō)一下
ASP.Net
頁(yè)提供類似如下方式的操作方法:
OleDbCommand2.Parameters("au_id").Value = TextBox1.Text
OleDbCommand2.Parameters("au_lname").Value = TextBox2.Text
OleDbCommand2.Parameters("au_fname").Value = TextBox3.Text
OleDbCommand2.Parameters("phone").Value = TextBox4.Text
OleDbCommand2.Parameters("address").Value = TextBox5.Text
OleDbCommand2.Parameters("city").Value = TextBox6.Text
OleDbCommand2.Parameters("st").Value = TextBox7.Text
OleDbCommand2.Parameters("zip").Value = TextBox8.Text
OleDbCommand2.Parameters("contract").Value = CheckBox1.Checked
cmdresults = OleDbcommand2.ExecuteNonQuery()
這個(gè)方法在我們以后的文章中,我們會(huì)慢慢給大家講解的,下一章我們要講的是如何從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)
前面我們已經(jīng)說(shuō)了如何操作
數(shù)據(jù)庫(kù)
,但幾乎全部是通過(guò)
OleDbCommand
和
OleDbDataReader
來(lái)做的,這次我們說(shuō)說(shuō)如何通過(guò)
OleDbDataAdapter
來(lái)操作數(shù)據(jù)庫(kù)!關(guān)于
OleDbDataAdapter
的用法實(shí)際上我們?cè)谝郧耙呀?jīng)講過(guò)了,由于
OleDbDataAdapter
是
DataSet
和數(shù)據(jù)源之間建立聯(lián)系的一個(gè)橋梁,而
DataSet
用于對(duì)單層數(shù)據(jù)、
XML
數(shù)據(jù)和關(guān)系數(shù)據(jù)進(jìn)行存儲(chǔ)、遠(yuǎn)程處理和編程!。
我們?cè)?jīng)講過(guò)利用
Command
來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行增加、刪除和修改操作,但是我們利用
DataSet
和
DataAdapter
能夠更加方便的對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,基本是我們可以認(rèn)為
DataSet
是專門(mén)為
WEB
而設(shè)計(jì)的,這也是
ADO.NET
和
ADO
的一個(gè)重要的區(qū)別。
下面是
DataSet
和
SQL
數(shù)據(jù)的的關(guān)系圖,
通過(guò)這個(gè)圖我們可以看出
DataSet
和
DataAdapter
以及
SQL
數(shù)據(jù)庫(kù)的關(guān)系。
下面我們來(lái)講解一下如何利用
DataSet
和
DataAdapter
來(lái)操作上據(jù)庫(kù)
MyConnection.Open(); //
打開(kāi)數(shù)據(jù)庫(kù),請(qǐng)參考前面文章的內(nèi)容
MyCommand.Connection = MyConnection; //
設(shè)置
Command
,請(qǐng)參考前面文章的內(nèi)容
MyCommand. CommandText =
“
select * from admin
”
; //
設(shè)置
Command
,參考前面文章的內(nèi)容
OleDbDataAdapter MyDataAdapter = new OleDbDataAdapter(); //
定義
OleDbDataAdapte
對(duì)象
MyDataAdapter.SelectCommand = MyCommand; //
設(shè)置
OleDbDataAdapte
對(duì)象的
SelectCommand
屬性
System.Data.DataSet MyDataSet = new System.Data.DataSet(); //
定義
DataSet
MyDataAdapter.Fill(MyDataSet,"admin"); //
通過(guò)
OleDbDataAdapte
對(duì)象的
SelectCommand
屬性填充
MyDataSet
MyConnection.Close(); //
關(guān)閉數(shù)據(jù)庫(kù)
整個(gè)過(guò)程分以下幾步:
1
.建立數(shù)據(jù)庫(kù)連接(打開(kāi)數(shù)據(jù)庫(kù),請(qǐng)參考前面文章的內(nèi)容)
2
.建立
OleDbDataAdapter
對(duì)象!
3
.實(shí)例化
OleDbDataAdapter
對(duì)象!
4
.建立一個(gè)
DataSet
對(duì)象,執(zhí)行
SQL
語(yǔ)句得到的表添加到其中
5
.關(guān)閉數(shù)據(jù)庫(kù)連接
通過(guò)上面的步驟我們就可以使用
DataBind
將
DataSet
中的數(shù)據(jù)綁定到特定的控件上了!(下一章我們將講解如何邦定數(shù)據(jù)庫(kù))
我們說(shuō)過(guò)但是我們可以利用
DataSet
和
DataAdapter
能夠更加方便的對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,如何通過(guò)
OleDbDataAdapter
來(lái)執(zhí)行數(shù)據(jù)庫(kù)的操作的,我們只需要對(duì)
DataSet
中的數(shù)據(jù)進(jìn)行增加、刪除、修改等操作,然后在將
DataSet
提交給數(shù)據(jù)庫(kù)即可
//
利用利用
DataSet
和
DataAdapter
操作數(shù)據(jù)庫(kù)
public Boolean DoDB()
{
MyConnection.Open(); //
打開(kāi)數(shù)據(jù)庫(kù),請(qǐng)參考前面文章的內(nèi)容
MyCommand.Connection = MyConnection; //
設(shè)置
Command
,請(qǐng)參考前面文章的內(nèi)容
MyCommand. CommandText =
“
select * from admin
”
; //
設(shè)置
Command
,參考前面文章的內(nèi)容
OleDbDataAdapter MyDataAdapter = new OleDbDataAdapter(); //
定義
OleDbDataAdapte
對(duì)象
MyDataAdapter.SelectCommand = MyCommand; //
設(shè)置
OleDbDataAdapte
對(duì)象的
SelectCommand
屬性
System.Data.DataSet MyDataSet = new System.Data.DataSet(); //
定義
DataSet
MyDataAdapter.Fill(MyDataSet,"admin"); //
通過(guò)
OleDbDataAdapte
對(duì)象的
SelectCommand
屬性填充
MyDataSet
OleDbCommandBuilder MyCommandBuild = new OleDbCommandBuilder(MyDataAdapter);//
關(guān)聯(lián)
DataSet
和數(shù)據(jù)庫(kù)的操作的,必不可少
foreach(DataRow dr in MyDataSet.Tables["Admin"].Rows)
{
if(dr["Admin_Code"].ToString().Trim().Equals("a"))
{
dr.Delete(); //
刪除
DataSet
中的行
}
}
MyDataSet.Tables["Admin"].Rows[0][0] = "ss";//
更新
DataSet
中第一行第一列的值
string [] dd = new String[3]{"a","b","v"};
MyDataSet.Tables["Admin"].Rows.Add(dd);//
增加一行
MyDataAdapter.Update(MyDataSet,"Admin");//
將
DataSet
中”
Admin
”表中的數(shù)據(jù)提交給數(shù)據(jù)庫(kù),完成數(shù)據(jù)庫(kù)的更新
MyConnection.Close();//
關(guān)閉數(shù)據(jù)庫(kù)
}
這個(gè)程序和我們前面用到的利用
Command
的
delete
、
insert
、
update
例程是執(zhí)行同樣的功能的,我這里改成了用
MyDataAdapter
來(lái)達(dá)到同樣的效果!
要通過(guò)
MyDataAdapter
執(zhí)行對(duì)數(shù)據(jù)庫(kù)的操作,我們要有下面的幾步:
1
.
建立數(shù)據(jù)庫(kù)連接
MyConnection
2
.
實(shí)例化
OleDbDataAdapter
對(duì)象!
3
.
建立一個(gè)
DataSet
對(duì)象,并把執(zhí)行
select
語(yǔ)句得到的記錄添加到其中
4
.
建立
OleDbCommandBuilder
對(duì)象!
并讓它與我們前面的
OleDbDataAdapter
對(duì)象關(guān)聯(lián)!語(yǔ)句如下:
OleDbCommandBuilder MyCommandBuild = new OleDbCommandBuilder(MyDataAdapter);
5
.
對(duì)
DataSet
中包含表的特定記錄進(jìn)行增加、刪除、修改
6
.
執(zhí)行
OleDbDataAdapter
對(duì)象的
Update
命令更新數(shù)據(jù)庫(kù),語(yǔ)句如下:
MyDataAdapter.Update(ds,"notes");
7
.
關(guān)閉數(shù)據(jù)庫(kù)連接
總結(jié):
DataSet
是
ADO.NET
中非常重要的內(nèi)容,也是
ADO.NET
和
ADO
的區(qū)別的一個(gè)重要表現(xiàn),特別適合成批的數(shù)據(jù)操作,也是數(shù)據(jù)棒定的重要來(lái)源。
OleDbDataAdapter
是
DataSet
和數(shù)據(jù)源之間建立聯(lián)系的一個(gè)橋梁,要熟練的使用
DataSet
我們需要熟練的掌握
OleDbDataAdapter
。下一章我們將講述
Data
對(duì)于用過(guò)
beta2
版的網(wǎng)友來(lái)說(shuō),學(xué)習(xí)本文的內(nèi)容將會(huì)是十分的簡(jiǎn)單,因?yàn)?/span>
.net
正式版和
beta2
版的差別不大,所以對(duì)于
beta2
中的程序你幾乎可以不作修改(或者只做少量修改)就可以再正式版中正常的運(yùn)行。
在這里我們來(lái)講一下怎樣打開(kāi)
數(shù)據(jù)庫(kù)
,我們不贊同利用寫(xiě)字本或者
editplus
等文本編輯器來(lái)編寫(xiě)
asp.net
,所以本文的講述全是在
VS.NET
開(kāi)發(fā)工具上的。
建立一個(gè)新的數(shù)據(jù)庫(kù)連接,首先我們從工具箱工雙擊
OleDbConnection
或者
雙擊
SqlConnection
如圖所示
?
注意:
OleDbConnection
和
SqlConnection
的區(qū)別在于:
OleDbConnection
適合于連接任何類型的數(shù)據(jù)庫(kù)(如
Oracle
,
SQL Server
,
ACCESS
等等),而
SqlConnection
是專門(mén)用來(lái)連接
SQL Server(MS SQL)
數(shù)據(jù)庫(kù)的,據(jù)說(shuō)效率比
OleDbConnection
高。如果你的數(shù)據(jù)庫(kù)是
MS SQL
那么你就雙擊
SqlConnection
吧,其他數(shù)據(jù)庫(kù)就用
OleDbConnection
吧。同樣的道理
SqlDataAdapter,SqlCommand
是專門(mén)用于
(MS SQL)
數(shù)據(jù)庫(kù)的,而
OleDbDataAdapter, OleDbCommand
適用于所有的數(shù)據(jù)庫(kù),如果你雙擊的是
SqlConnection
,那么在今后的數(shù)據(jù)庫(kù)操作中你只能用
SqlDataAdapter,SqlCommand
,同樣的道理如果你雙擊的是
OleDbConnection
,那么在今后的數(shù)據(jù)庫(kù)操作中你只能用
OleDbDataAdapter, OleDbCommand
。在這里我們選擇
OleDbConnection
。
當(dāng)我們雙擊
OleDbConnection
后在窗口的下端將會(huì)出現(xiàn)一個(gè)名為
oleDbConnection1
的數(shù)據(jù)庫(kù)連接源
我們可以在屬性窗口改變
oleDbConnection1
的名稱為
MyConnection,
連接數(shù)據(jù)庫(kù)在關(guān)鍵的步驟為:從上圖中的
ConnctionStr
中選擇
<
新建連接…
>
然后將會(huì)彈出如下窗口:
選擇好數(shù)據(jù)庫(kù)的類型
“下一步”后
選擇數(shù)據(jù)庫(kù)的正確位置
如下圖
(測(cè)試連接
成功后)單擊確定,然后(雙擊編輯窗口任意空白位置)打開(kāi)對(duì)應(yīng)的
cs
文件,將會(huì)看到程序中自動(dòng)加入了
protected System.Data.OleDb.OleDbConnection MyConnection;
代碼
而且在
private void InitializeComponent()
中加入了
this.MyConnection = new System.Data.OleDb.OleDbConnection();
//
// MyConnection
//
this.MyConnection.ConnectionString = @"Provider=SQLOLEDB.1;Persist Security
Info=False;User ID=sa;Initial Catalog=house;Data Source=CYH;Use Procedure
for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=CYH;Use
Encryption for Data=False;Tag with column collation when possible=False";
//
現(xiàn)在要打開(kāi)數(shù)據(jù)庫(kù)變得很簡(jiǎn)單了,你只要使用
MyConnection.Open(); //
數(shù)據(jù)庫(kù)就打開(kāi)了
MyConnection.Close();//
關(guān)閉數(shù)據(jù)庫(kù)
如你可以在
private void Page_Load(object sender, System.EventArgs e)
打開(kāi)數(shù)據(jù)庫(kù)
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();
//
在此處放置用戶代碼對(duì)數(shù)據(jù)庫(kù)進(jìn)行增加、刪除、修改、查詢等操作
MyConnection.Close();
}
?