您的位置:首页 > 其它

Oledbadapter使用感受

2010-07-26 20:56 162 查看
答应帮同学写个程序,程序背景为:他们公司有许多应收、应付票据到期需要承兑,我同学希望将这些票据录入到程序中,为每张票据设置一个到期提醒日期,程序在到期提醒日提醒我同学有票据需要承兑,请处理即可。其实程序看上去很简单,但是实现起来还是花费了我 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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: