Visual+C#数据库编程实例详解Word下载.docx
《Visual+C#数据库编程实例详解Word下载.docx》由会员分享,可在线阅读,更多相关《Visual+C#数据库编程实例详解Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
年龄
zip
邮政编码
远程数据库SqlServer2000的数据库服务器名称为"
Server1"
数据库名称为"
Data1"
,登陆的ID为"
sa"
,口令为空,在数据库也定义了一张"
表,数据结构如上表。
二.如何浏览数据:
在《VisualC#的数据绑定》中,已经了解了如何把数据集中的某些字段绑定到WinForm组件的某个属性上,这样程序员就可以根据以WinForm组件的来定制数据显示的形式,并且此时的WinForm组件显示内容就可以随着记录指针的变化而改变。
至此可见,浏览数据记录的关键就是如何改变记录指针。
要实现这种操作,就要使用到BindingManagerBase类,此类的主要作用是管理对于那些实现了对同一个数据源进行绑定的对象。
说的具体些,就是能够使得Windows窗体上的已经对同一数据源进行数据绑定的组件保持同步。
在BindingManagerBase类中定义了一个属性"
Position"
,通过这个属性就可以改变BindingManagerBase对象中的数据指针。
创建BindingManagerBase对象必须要使用到BindingContext类,其实每一个由Control类中继承而得到的对象,都有单一的BindingContext对象,在大多数创建窗体中实现数据绑定组件的BindingManagerBase对象是使用Form类的BindingContext来得到。
下列代码是以Access2000数据库为模型,创建的一个名称为"
myBind"
的BindingManagerBase对象。
//创建一个OleDbConnection
stringstrCon="
Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=db.mdb"
;
OleDbConnectionmyConn=newOleDbConnection(strCon);
stringstrCom="
SELECT*FROMperson"
file:
//创建一个DataSet
myDataSet=newDataSet();
myConn.Open();
//用OleDbDataAdapter得到一个数据集
OleDbDataAdaptermyCommand=newOleDbDataAdapter(strCom,myConn);
//把Dataset绑定books数据表
myCommand.Fill(myDataSet,"
);
//关闭此OleDbConnection
myConn.Close();
myBind=this.BindingContext[myDataSet,"
];
下列代码是以SqlServer2000数据库为模型,创建一个名称为"
//设定数据连接字符串,此字符串的意思是打开Sqlserver数据库,服务器名称为server1,数据库为data1
Provider=SQLOLEDB.1;
PersistSecurityInfo=False;
UserID=sa;
InitialCatalog=data1;
DataSource=server1"
//把Dataset绑定person数据表
person"
得到了是同一数据源的BindingManagerBase对象,通过改变此对象的"
属性值,这样绑定数据的组件显示的数据就随之变化,从而实现导航数据记录。
<
I>
.导航按钮"
上一条"
实现方法:
protectedvoidGoPrevious(objectsender,System.EventArgse)
{
if(myBind.Position==0)
MessageBox.Show("
已经到了第一条记录!
"
"
信息提示!
MessageBoxButtons.OK,MessageBoxIcon.Information);
else
myBind.Position-=1;
}
II>
.导航按钮"
下一条"
protectedvoidGoNext(objectsender,System.EventArgse)
if(myBind.Position==myBind.Count-1)
已经到了最后一条记录!
"
myBind.Position+=1;
III>
至尾"
protectedvoidGoLast(objectsender,System.EventArgse)
myBind.Position=myBind.Count-1;
<
IV>
至首"
protectedvoidGoFirst(objectsender,System.EventArgse)
myBind.Position=0;
注释:
Count"
是BindingManagerBase对象的另外一个重要的属性,是数据集记录的总数。
三.实现删除记录:
在对数据记录进行操作的时候,有二点必须十分清晰:
其一:
在对数据记录进行操作的时候,我想有一些程序员一定有这样一个疑惑,当对数据库服务器请求数据集的时候,就会产生"
DataSet"
对象,用以管理数据集,这样如果这些对数据库服务器的请求非常多,同样也就会产生很多的"
对象,达到一定时候必然会使得数据库服务器崩溃。
这种想法是自然的,但和实际并不相符,因为"
对象并不是在服务器端产生的,而是在客户端产生的。
所以面对众多的数据请求的时候对数据库服务器的影响并不十分太大。
其二:
记得在用Delphi编写三层数据模型的时候的,每一次对数据库的修改其实只是对第二层产生的数据集的修改,要真正修改数据库,还必须调用一个另外的方法。
在用ADO.NET处理数据库的时候,虽然处理的直接对象是数据库,但此时"
对象中的内容并没有随之改变,而绑定的数据组件显示的数据又来源于"
对象,这样就会产生一个错觉,就是修改了的记录并没有修改掉,删除的记录并没有删除掉。
所以对数据记录进行操作的时候,在修改数据库后,还要对"
对象进行必要的修改,这样才能保证"
对象和数据库内容一致、同步。
下面代码是删除当前绑定组件显示的记录的程序代码,此代码是以Access2000数据库为模板的:
protectedvoidDelete_record(objectsender,System.EventArgse)
{
DialogResultr=MessageBox.Show("
是否删除当前记录!
删除当前记录!
MessageBoxButtons.YesNo,MessageBoxIcon.Question);
intss=(int)r;
if(ss==6)//按动"
确定"
按钮
try{
//连接到一个数据库
DataSource=db.mdb"
stringstrDele="
DELETEFROMpersonWHEREid="
+t_id.Text;
OleDbCommandmyCommand=newOleDbCommand(strDele,myConn);
//从数据库中删除指定记录
myCommand.ExecuteNonQuery();
//从DataSet中删除指定记录
myDataSet.Tables["
].Rows[myBind.Position].Delete();
].AcceptChanges();
catch(Exceptioned)
删除记录错误信息:
"
+ed.ToString(),"
错误!
}
下面代码是删除当前绑定组件显示的记录的程序代码,此代码是以SqlServer2000数据库为模板的,二者的区别仅仅在于数据链接:
//设定数据连接字符串,意思是打开Sqlserver数据库,服务器名称为server1,数据库为data1
在这二段代码中,在更改数据库的同时也对"
DatsSet"
对象进行了必要的修改。
下图是程序中对数据记录进行删除操作的运行界面:
图01:
删除记录
四.插入数据记录:
对数据库进行插入记录操作和删除记录操作基本的思路是一致的,就是通过ADO.NET首先插入数据记录到数据库,然后对"
对象进行必要的修改。
下列代码就是以Access2000数据库为模型修改当前记录的代码:
protectedvoidUpdate_record(objectsender,System.EventArgse)
inti=myBind.Position;
].Rows[myBind.Position].BeginEdit();
//从数据库中修改指定记录
stringstrUpdt="
UPDATEpersonSETxm='
+t_xm.Text+"
'
xb='
+t_xb.Text+"
nl="
+t_nl.Text+"
zip="
+t_books.Text+"
WHEREid="
OleDbCommandmyCommand=newOleDbCommand(strUpdt,myConn);
].Rows[myBind.Position].EndEdit();
修改指定记录错误:
myBind.Position=i;
由于对SqlServer2000数据记录修改操作和Access2000数据记录修改操作的差异只在于不同的数据链接,具体的代码可以参考"
删除数据记录"
中的代码,在这里就不提供了。
五.插入数据记录:
和前面二种操作在思路是一致的,就是通过ADO.NET首先插入数据记录到数据库,然后对"
下列代码就是以Access2000数据库为模型插入一条数据记录的代码
protectedvoidInsert_record(objectsender,System.EventArgse)
try
//判断所有字段是否添完,添完则执行,反之弹出提示
if(t_id.Text!
="
&
&
t_xm.Text!
t_xb.Text!
t_nl.Text!
t_books.Text!
)
stringmyConn1="
OleDbConnectionmyConn=newOleDbConnection(myConn1);
stringstrInsert="
INSERTINTOperson(id,xm,xb,nl,zip)VALUES("
strInsert+=t_id.Text+"
'
strInsert+=t_xm.Text+"
strInsert+=t_xb.Text+"
strInsert+=t_nl.Text+"
strInsert+=t_books.Text+"
)"
OleDbCommandinst=newOleDbCommand(strInsert,myConn);
inst.ExecuteNonQuery();
必须填满所有字段值!
保存数据记录发生"
同样对SqlServer2000数据库进行插入记录操作和Access2000数据库插入记录操作的差异也只在于不同的数据链接,具体的代码可以参考"
六.VisualC#数据库编程的完成源代码和程序运行的主界面:
掌握了上面要点,编写一个完整的数据库编程的程序就显得非常容易了,下面是VisualC#进行数据库编程的完整代码(Data01.cs),此代码是以Access2000数据库为模型设计的,具体如下:
usingSystem;
usingSystem.Drawing;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Data.OleDb;
usingSystem.Data;
publicclassData:
Form
privateSystem.ComponentModel.Containercomponents=null;
privateButtonlastrec;
privateButtonnextrec;
privateButtonpreviousrec;
privateButtonfirstrec;
privateTextBoxt_books;
privateTextBoxt_nl;
privateComboBoxt_xb;
privateTextBoxt_xm;
privateTextBoxt_id;
privateLabell_books;
privateLabell_nl;
privateLabell_xb;
privateLabell_xm;
privateLabell_id;
privateLabellabel1;
privateDataSetmyDataSet;
privateButtonbutton1;
privateButtonbutton2;
privateButtonbutton3;
privateButtonbutton4;
privateBindingManagerBasemyBind;
publicData()
GetConnected();
//对窗体中所需要的内容进行初始化
InitializeComponent();
//清除在程序中使用过的资源
protectedoverridevoidDispose(booldisposing)
if(disposing)
if(components!
=null)
components.Dispose();
base.Dispose(disposing);
publicstaticvoidMain()
Application.Run(newData());
publicvoidGetConnected()
fil