C#与Access数据库相关操作.docx
《C#与Access数据库相关操作.docx》由会员分享,可在线阅读,更多相关《C#与Access数据库相关操作.docx(11页珍藏版)》请在冰豆网上搜索。
C#与Access数据库相关操作
C#对Access数据库的操作
下面以Access数据库为例说明,用C#的DataSet类访问数据库的一些操作方法。
操作涉及的主要C#类有:
DataSet:
对应数据库表的一个集合,实际上是数据库表在内存中的一个缓存
DataTable:
对应数据库表,是数据库表行的集合
DataRow:
对应数据库表行
OleDbConnection:
建立数据库连接
OleDbDataAdapter:
由数据库生成DataSet,并负责DataSet与数据库的同步
OleDbCommandBuilder:
生成更新数据库所需的指令
DataSet、DataTable、DataRow用于数据在缓存中的操作,这上面的操作只有更新到数据库中,修改结果才会被永久保存。
OleDbConnection是用OLEDB方法连接数据库所必需的。
OleDbDataAdapter和OleDbCommandBuilder用来生成DataSet,完成数据库更新。
与OleDbDataAdapter和OleDbCommandBuilder相对应,SqlDataAdapter和SqlCommandBuilder也可以完成用SQL语言为指令的数据库更新。
假设在D:
盘创建了Access数据库,其路径为d:
\0DBAcs\account.mdb,数据库中有一张名为kaizhi的数据库表。
表结构如下:
表名;Kaizhi
字段
FieldName
类型
说明
1
开支ID
kzID
长整型
自动编号
2
开支人
Kzren
文本
50字符
3
开支项目名
kzname
文本
50字符
4
日期
riqi
日期/时间
99-99-99;0掩码
5
开支说明
shuoming
文本
225字符
6
总金额
zonge
单精度
小数点任意;这项开支的总花费
7
数量
shuliang
长整型
8
单价
Danjia
单精度
小数点任意
表建好之后:
(1)对表中添加新数据
(2)查询表中的某个字段。
为了实现这两项功能,以下几个问题要考虑:
1准备工作
声明必须的公共变量
建立与数据库的连接,创建DataSet对象
2添加记录
在DataSet对象上添加记录
同步DataSet对象对象与数据库中的数据,这一点很重要,很多人忘记了数据进行同步,结果往往是添加、修改的数据不能保存到数据库中。
3查询数据库表中某记录的某字段;
我们可以将上述功能用一个类DataOper实现,下面是程序设计的主要活动。
声明要用的C#系统类
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.IO;
usingSystem.Data;
usingSystem.Data.OleDb;
usingSystem.Data.SqlClient;
声明DataOper类中的公共变量
privatestringDBlocation;
privateOleDbConnectiondbconn;//数据库连接
privateOleDbDataAdapterda;
建立与数据库的连接,这里采用了OLEDB方法:
dbconn=newOleDbConnection(@"provider=microsoft.jet.oledb.4.0;DataSource=d:
\0DBAcs\account.mdb");
dbconn.Open();
创建DataSet对象
da=newOleDbDataAdapter(@"select*fromkaizhi",dbconn);//引用数据库连接dbconn并依据SQL语句"select*fromkaizhi"创建OleDbDataAdapter对象da
DataSetds=newDataSet();//创建DataSet对象
da.Fill(ds);
//用OleDbDataAdapter对象da填充、更新刚创建的DataSet对象
添加记录并更新数据库
OleDbCommandBuildercb=newOleDbCommandBuilder(da);//创建OleDbCommandBuilder对象cb用于更新OleDbDataAdapter对象da的Insert、Delete、Update指令
da.UpdateCommand=cb.GetUpdateCommand();//更新OleDbDataAdapter对象da的指令
设计人员可以编写自己的更新指令,也可以象上面所写的那样用系统默认的指令。
但不管怎样,上面的语句不能缺少,否则程序在运行中会抛出异常System.InvalidOperationException,并提示:
UpdaterequiresavalidInsertCommandwhenpassedDataRowcollectionwithnewrows.
DataRowdrx=ds.Tables[0].NewRow();//创建一条新记录行
drx["kzren"]="kzren";
drx["kzname"]="kzname";
drx["riqi"]=2008-10-11;
drx["shuoming"]="shuoming";
drx["zonge"]=12;
drx["shuliang"]=3;
drx["danjia"]=4;
ds.Tables[0].Rows.Add(drx);//在表中追加记录
da.Update(ds);//更新数据库
要查询引用某记录的某字段,直接按如下的方法引用就可以了。
Stringkx=ds.Tables[0].Rows[0]["kzren"].ToString()
连接access
首先看一个例子代码片断:
程序代码:
--------------------------------------------------------------------------------
usingsystem.data;
usingsystem.data.oledb;
......
stringstrconnection="provider=microsoft.jet.oledb.4.0;";
strconnection+=@"datasource=c:
\begaspnet\northwind.mdb";
oledbconnectionobjconnection=newoledbconnection(strconnection);
......
objconnection.open();
objconnection.close();
......
--------------------------------------------------------------------------------
解释:
连接access数据库需要导入额外的命名空间,所以有了最前面的两条using命令,这是必不可少的!
strconnection这个变量里存放的是连接数据库所需要的连接字符串,他指定了要使用的数据提供者和要使用的数据源.
"provider=microsoft.jet.oledb.4.0;"是指数据提供者,这里使用的是microsoftjet引擎,也就是access中的数据引擎,就是靠这个和access的数据库连接的.
"datasource=c:
\begaspnet\northwind.mdb"是指明数据源的位置,他的标准形式是"datasource=mydrive:
mypath\myfile.mdb".
ps:
1."+="后面的"@"符号是防止将后面字符串中的"\"解析为转义字符.
2.如果要连接的数据库文件和当前文件在同一个目录下,还可以使用如下的方法连接:
strconnection+="datasource=";
strconnection+=mappath("northwind.mdb");
这样就可以省得你写一大堆东西了!
3.要注意连接字符串中的参数之间要用分号来分隔.
"oledbconnectionobjconnection=newoledbconnection(strconnection);"这一句是利用定义好的连接字符串来建立了一个链接对象,以后对数据库的操作我们都要和这个对象打交道.
"objconnection.open();"这用来打开连接.至此,与access数据库的连接完成.其余操作(插入,删除...)请参阅相关书籍
连接sqlserver
例子代码片断:
程序代码:
--------------------------------------------------------------------------------
usingsystem.data;
usingsystem.data.sqlclient;
...
stringstrconnection="userid=sa;password=;";
strconnection+="initialcatalog=northwind;server=yoursqlserver;";
strconnection+="connecttimeout=30";
sqlconnectionobjconnection=newsqlconnection(strconnection);
...
objconnection.open();
objconnection.close();
...
--------------------------------------------------------------------------------
解释:
连接sqlserver数据库的机制与连接access的机制没有什么太大的区别,只是改变了connection对象和连接字符串中的不同参数.
首先,连接sqlserver使用的命名空间不是"system.data.oledb",而是"system.data.sqlclient".
其次就是他的连接字符串了,我们一个一个参数来介绍(注意:
参数间用分号分隔):
"userid=sa":
连接数据库的验证用户名为sa.他还有一个别名"uid",所以这句我们还可以写成"uid=sa".
"password=":
连接数据库的验证密码为空.他的别名为"pwd",所以我们可以写为"pwd=".
这里注意,你的sqlserver必须已经设置了需要用户名和密码来登录,否则不能用这样的方式来登录.如果你的sqlserver设置为windows登录,那么在这里就不需要使用"userid"和"password"这样的方式来登录,而需要使用"trusted_connection=sspi"来进行登录.
"initialcatalog=northwind":
使用的数据源为"northwind"这个数据库.他的别名为"database",本句可以写成"database=northwind".
"server=yoursqlserver":
使用名为"yoursqlserver"的服务器.他的别名为"datasource","address","addr".如果使用的是本地数据库且定义了实例名,则可以写为"server=(local)\实例名";如果是远程服务器,则将"(local)"替换为远程服务器的名称或ip地址.
"connecttimeout=30":
连接超时时间为30秒.
在这里,建立连接对象用的构造函数为:
sqlconnection.
其余的就和access没有什么区别了!
********************************************************************************************************************
用c#访问access数据库
我编写这个程序的动机是当我希望用csharp访问msaccess数据库的时候我没有办法获得任何信息和参考材料.网上所能获得的所有材料都是偏重于sql的,所以我们将分两步来编写这个应用程序,第一我们将展示如何连接到msaccess数据库然后看看它有多复杂.最后,我们就这样完成了这个程序.
闲言少序,让我们开始正题.连接到数据库的过程与我们早先的ado连接过程相比已经发生了较大的变化.下面的图表恰当的(我希望如此)oledbconnection-->oledbcommand-->oledbdatareader.现在那些熟悉ado的人很明显能看出两者的相似之处但是为了使那些还没有很好的适应ado的人能够明白,下面是一些解释.
oledbconnection-->代表对数据库的单一连接,根据底层数据库的功能它能给你操纵数据库的能力.有一点必须记住,虽然oledbconnection对象出了作用范围,它也不会自动被关闭.所以,你将不得不显示的调用这个对象的close()方法.
oledbcommand-->这是就象我们在ado中使用的一样的通常的command对象.你可以通过这个对象调用sql存储过程或是sql查询语句.
oledbdatareader-->这个类拥有非常大的重要性因为它提供了实际上的对数据库底层数据集的访问.当你调用oledbcommand的executereader方法的时候它就会被创建,.netbeta2sdk说不要直接创建这个类的对象.
现在你可以在.netbeta2的文档中看到更多的关于这些主要对象的说明,下面是指出如何在程序中访问数据库的源代码.
usingsystem;
usingsystem.data.oledb;
classoledbtest{
publicstaticvoidmain()
{
/创建数据库连接
oledbconnectionaconnection=newoledbconnection("provider=microsoft.jet.oledb.4.0;datasource=c:
\\db1.mdb");
/创建command对象并保存sql查询语句
oledbcommandacommand=newoledbcommand("select*fromemp_test",aconnection);
try
{
aconnection.open();
/创建datareader对象来连接到表单
oledbdatareaderareader=acommand.executereader();
console.writeline("thisisthereturneddatafromemp_testtable");
/循环遍历数据库
while(areader.read())
{
console.writeline(areader.getint32(0).tostring());
}
/关闭reader对象
areader.close();
/关闭连接,这很重要
aconnection.close();
}
/一些通常的异常处理
catch(oledbexceptione)
{
console.writeline("error:
{0}",e.errors[0].message);
}
}
}
成功运行这个程序的步骤
1.用msaccess创建一个名叫db1.mdb的数据库
2.创建一个名叫emp_test的表单
3.使它包含下列数据域
emp_codeint
emp_nametext
emp_exttext
4.将上面的代码保存到sample.cs文件中
5.确保数据库位于c:
\并确保mdac2.6或是更新的版本已经被安装
6.编译运行
现在让我们来了解一些我们在oledbconnection对象的构造函数看到的东西的一些细节,在这里你看见诸如"provider="之类的东西.下面是一些和兼容的驱动程序类型.
sqlolddb-->microsoftoledbproviderforsqlserver,
msdaora-->microsoftoledbproviderfororacle,
microsoft.jet.oledb.4.0-->oledbproviderformicrosoftjet
你可以选择其中的任何一个但是他们会需要传递不同的参数,例如jet.oledb.需要传递mdb文件的名字而sqloledb需要传递用户名和密码.
所有这些驱动程序都位于system.data.oledb命名空间里,所以你必须包括它,而且它们和oledbproviderforodbc不兼容,也就是说你不能在vb6.0程序里使用这些驱动程序来访问数据库,所以不要去寻找解释为什么要把这些数据库放在c:
\上的资料了
当你使用microsoftsqlserver7.0或者更新版本的时候,下面是微软给出的一些指导:
推荐使用.netdataprovider在下列情况中,使用microsoftsqlserver7.0或者更新版本的中间层应用程序,使用microsoftdataengine(msde)或icrosoftsqlserver7.0或者更新版本的单层应用程序.
建议将oledbproviderforsqlserver(sqloledb)和oledb.netdataprovider一起使用.
对于microsoftsqlserver6.5和更早的版本,你必须同时使用oledbproviderforsqlserver和oledataprovider.
推荐使用microsoftsqlserver6.5和更早的版本或是oracle的中间层应用程序使用oledb.netdataprovider.
对于microsoftsqlserver7.0或者更新版本,推荐sqlserver.netdataprovider.
推荐单层应用程序使用microsoftaccess数据库.
不推荐一个中间层程序同时使用oledb.netdataprovider和microsoftaccess数据库.
不再支持oledbproviderforodbc(msdasql)