现在的位置: 首页 > 综合 > 正文

DataAdapte操作数据库

2013年02月16日 ⁄ 综合 ⁄ 共 2835字 ⁄ 字号 评论关闭
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; 

catch(Exception e) 

tempvalue=false; 

finally
  {
  if (conn.State.ToString() != "Close")
  {
  conn.Close(); 
return(tempvalue);
  }
  }

要通过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命令来更新数据库!

    在一些应用中可能需要判断那些数据可以进入数据(增、删、改)的时候就不需要判断一条记录执行一次sql访问了,直接修改detaset.tables 中的数据,完成后DataAdapter.Update 不需要写sql语句, sql访问集中执行速度快.

定义dataset的主键,就可通过主键定位到dataset的某一行,完成修改.

DtaColum[] keys=new Datacolum[1];

key[0]=ds.Tables["notes"].Colum[0];

ds.Tables["notes"].PrimaryKey=keys;

也可以直接从数据库中加载主键,这不会默认完成,必须在填充DataSet之前设置DataAdapter的MissingSchemaAction属性显示的告诉加载主键信息:

myAdapter.MissingSchemaAction=MissingSchemaAction.AddWithKey;

 

DataEow findRow=ds.Tables["notes"].Rows.Find("目标值");

定位完成后可以删除目标行。

findRow.Delete();

也可一修改目标行.

Rows集合中的每个DataRow对象都具有属性RowSate,可以跟踪此行是否删除、添加、修改,还是未作变动。

修改时会将修改完成的数据记回内存,同时记录RowSate为修改。

删除时运行delete()方法后并没有真正删除该行,而是将RowSate设置为Deleted,调用DateSet的Update()时查找数据库中该行数据,从数据库中删除。

insert时记录RowStae为Insert,Update()时如果插入数据库已有数据会返回,后面其他行不会执行操作。

执行DateSet的AceptChange()时DataSet中的数据会改变,如果是删除行,此时RowSate设置为为Deleted的行将被删除,此时再调用Update()将无法删除这些行,因为Update仅影响在Rows集合中找到的行,遗漏的行被忽略。此问题也使用与Remove()方法。

在修改完成后,仅仅影响Dataset中的数据,存在与内从中。不影响数据库中的数据。调用Update()后才能使DataSet中的内存数据同磁盘上的数据库同步。

更新数据库时即使调用了Update()也仅影响在DataSt集合中包含的行,遗漏的行会被忽略.

其实,上面的结构不仅适合与delete操作,同样适合insert、update操作的,只要我们把上面的第5步改成相应的操作语句就可以的!

抱歉!评论已关闭.