Oledbadapter使用感受

       答应帮同学写个程序,程序背景为:他们公司有许多应收、应付票据到期需要承兑,我同学希望将这些票据录入到程序中,为每张票据设置一个到期提醒日期,程序在到期提醒日提醒我同学有票据需要承兑,请处理即可。其实程序看上去很简单,但是实现起来还是花费了我 1 天时间。

       首先,这是一个纯客户端小程序,因此用 java flex 等写就不是很适合了,考量再三还是用 vs2005 吧,因为只要 xp sp2 之后的操作系统都带了 .net 2.0 及以上的框架的,只要 vs2005 编译后的 exe 文件即可执行。

       其次,由于需要存储票据信息、票据发生关系单位信息、票据承兑银行信息,因此需要文件或者数据库来保存这些信息。起初,打算使用搞 3 xml 文件来存储,后来考虑票据还是蛮多的, xml 操作起来有点费劲,而且本来 vs2005 自带的 xml 操作性能就不是很好,最后还是决定使用 access 数据库。可笑的是本人电脑上还没有 access 数据库软件,还是 csdn 上一位朋友帮我建好库、表给我发过来的。在此,谢谢那位仁兄了。

       接下来就是用 vs2005 access 数据库如何实现我同学的功能需求了,经功能分解程序主要有 3 个窗体和系统托盘功能。

1)  FrmBill :票据信息维护、查看窗体;

2)  FrmCompany :对方单位选取弹出对话框,维护票据信息时,需要选择对方单位;

3)  FrmBank :承兑银行选取弹出对话框,维护票据信息时,需要选择承兑银行;

4)  系统托盘:由于程序需要电脑启动时就启动,因此程序启动起来之后直接最小化到系统托盘中,检查是否有到期提醒日的票据,有的话告知用户。

综合 FrmBill FrmCompany FrmBank3 个窗体其实功能一样,都是数据的增、删、改和保存。考虑之下使用 ado.net oledbadapter 来填充、更新数据。在我看来 oledbadapter 操作数据就做 4 件事情:

1)  创建数据库连接;

2)  构建 oledbadapter 实例;

3)  绑定 oledbadapter selectcommand, updatecommand, insertcommand, deletecommand ,这步操作最为关键;

4)  调用 oledbadapter fill 进行查询操作、 update 进行更新操作;

为什么设置了 oledbadapter updatecommand insertcommand deletecommand 之后,当 datagridview 发生数据变更时调用 oledbadapter.update 操作即可将 datagridview 数据变更提交到数据库?这里关键之处是 datagridview datasource datatable 其每一行都是有状态,如: deleted,new,normal 等, oledbadapter 就是根据其填充的 datatable 的行状态来提交增、删、改数据,提交完毕之后,调用 datatable acceptchange 重置 datatable 的行状态。

下述为 FrmBill 窗体, Oledbadapter 的核心代码。

string sql = "select invoicevo.*, duifangdanweivo.duifangname, bankvo.bankname from invoicevo, duifangdanweivo, bankvo where expirydate >=#2010-7-25# and invoicevo.bank = bankvo.bankid and invoicevo.duifangdanwei = duifangdanweivo.id" ;

adapter = new OleDbDataAdapter (sql,DBManager .getConn());

// 绑定insertcommand ,注意参数的顺序、类型

OleDbCommand insertCmd = new OleDbCommand ("insert into invoicevo(oid, billno,duifangdanwei,bank,billtype,status,expirydate,infodate,inputdate,[money],[note]) values(?,?,?,?,?,?,?,?,?,?,?)" , DBManager .getConn());

insertCmd.Parameters.Add("oid" , OleDbType .VarChar, 100, "oid" );

insertCmd.Parameters.Add("billno" , OleDbType .VarChar, 100, "billno" );

insertCmd.Parameters.Add("duifangdanwei" , OleDbType .VarChar, 100, "duifangdanwei" );

insertCmd.Parameters.Add("bank" , OleDbType .VarChar, 100, "bank" );

insertCmd.Parameters.Add("billtype" , OleDbType .VarChar, 100, "billtype" );

insertCmd.Parameters.Add("status" , OleDbType .VarChar, 100, "status" );

insertCmd.Parameters.Add("expirydate" , OleDbType .DBDate, 0, "expirydate" );

insertCmd.Parameters.Add("infodate" , OleDbType .DBDate, 0, "infodate" );

insertCmd.Parameters.Add("inputdate" , OleDbType .DBDate, 0, "inputdate" );

insertCmd.Parameters.Add("money" , OleDbType .Double, 0, "money" );

insertCmd.Parameters.Add("note" , OleDbType .VarChar, 100, "note" );

adapter.InsertCommand = insertCmd;

// 绑定 updateCmd ,注意参数的顺序、类型

OleDbCommand updateCmd = new OleDbCommand ("update invoicevo set billno=?, duifangdanwei=?, bank=?, billtype =?, status=?, expirydate=?, infodate=?," +

"inputdate=?, [money]=?,[note]=? where oid=?" , DBManager .getConn());

updateCmd.Parameters.Add("billno" , OleDbType .VarChar, 100, "billno" );

updateCmd.Parameters.Add("duifangdanwei" , OleDbType .VarChar, 100, "duifangdanwei" );

updateCmd.Parameters.Add("bank" , OleDbType .VarChar, 100, "bank" );

updateCmd.Parameters.Add("billtype" , OleDbType .VarChar, 100, "billtype" );

updateCmd.Parameters.Add("status" , OleDbType .VarChar, 100, "status" );

updateCmd.Parameters.Add("expirydate" , OleDbType .DBDate, 0, "expirydate" );

updateCmd.Parameters.Add("infodate" , OleDbType .DBDate, 0, "infodate" );

updateCmd.Parameters.Add("inputdate" , OleDbType .DBDate, 0, "inputdate" );

updateCmd.Parameters.Add("money" , OleDbType .Double, 0, "money" );

updateCmd.Parameters.Add("note" , OleDbType .VarChar, 100, "note" );

updateCmd.Parameters.Add("oid" , OleDbType .VarChar, 100, "oid" );

adapter.UpdateCommand = updateCmd;

// 绑定DeleteCommand ,注意参数的顺序、类型

OleDbCommand deleteCmd = new OleDbCommand ("delete from invoicevo where oid=?" , DBManager .getConn());

deleteCmd.Parameters.Add("oid" , OleDbType .VarChar, 100, "oid" );

adapter.DeleteCommand = deleteCmd;

 

// 填充数据======================================================

DataSet ds = new DataSet ();

adapter.Fill(ds);

dgv1.DataSource = ds.Tables[0];

 

// 保存数据======================================================

// 这句话一定要写,否则数据可能保存不进去

this .BindingContext[this .dgv1.DataSource].EndCurrentEdit();

adapter.Update((DataTable )dgv1.DataSource);

你可能感兴趣的:(Oledbadapter使用感受)