Oledbadapter使用感受


  Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1445272483; mso-list-type:hybrid; mso-list-template-ids:1815762994 -1634926634 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-text:%1); mso-level-tab-stop:39.0pt; mso-level-number-position:left; margin-left:39.0pt; text-indent:-18.0pt;} @list l1 {mso-list-id:1555701925; mso-list-type:hybrid; mso-list-template-ids:-1008581030 504252938 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1 {mso-level-text:%1); mso-level-tab-stop:39.0pt; mso-level-number-position:left; margin-left:39.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->         答应帮同学写个程序,程序背景为:他们公司有许多应收、应付票据到期需要承兑,我同学希望将这些票据录入到程序中,为每张票据设置一个到期提醒日期,程序在到期提醒日提醒我同学有票据需要承兑,请处理即可。其实程序看上去很简单,但是实现起来还是花费了我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 = newOleDbDataAdapter (sql,DBManager .getConn()); //绑定insertcommand ,注意参数的顺序、类型
  OleDbCommand insertCmd = newOleDbCommand ("insert into invoicevo(oid, billno,duifangdanwei,bank,billtype,status,expiryda te,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 = newOleDbCommand ("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 = newOleDbCommand ("delete from invoicevo where oid=?" , DBManager .getConn());
  deleteCmd.Parameters.Add("oid" , OleDbType .VarChar, 100, "oid" );
  adapter.DeleteCommand = deleteCmd;
  //填充数据================================================== ====
  DataSet ds = newDataSet ();
  adapter.Fill(ds);
  dgv1.DataSource = ds.Tables[0];
  //保存数据================================================== ====
  //这句话一定要写,否则数据可能保存不进去
  this.BindingContext[this .dgv1.DataSource].EndCurrentEdit();
  adapter.Update((DataTable )dgv1.DataSource);

猜你喜欢

转载自yukukuku.iteye.com/blog/1573688