<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:UseFELayout /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if !mso]> < classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui> </object> <mce:style><! st1\:*{behavior:url(#ieooui) } -->
答应帮同学写个程序,程序背景为:他们公司有许多应收、应付票据到期需要承兑,我同学希望将这些票据录入到程序中,为每张票据设置一个到期提醒日期,程序在到期提醒日提醒我同学有票据需要承兑,请处理即可。其实程序看上去很简单,但是实现起来还是花费了我 1 天时间。
首先,这是一个纯客户端小程序,因此用 java 、 flex 等写就不是很适合了,考量再三还是用 vs2005 吧,因为只要 xp sp2 之后的操作系统都带了 .net 2.0 及以上的框架的,只要 vs2005 编译后的 exe 文件即可执行。
其次,由于需要存储票据信息、票据发生关系单位信息、票据承兑银行信息,因此需要文件或者数据库来保存这些信息。起初,打算使用搞 3 个 xml 文件来存储,后来考虑票据还是蛮多的, xml 操作起来有点费劲,而且本来 vs2005 自带的 xml 操作性能就不是很好,最后还是决定使用 access 数据库。可笑的是本人电脑上还没有 access 数据库软件,还是 csdn 上一位朋友帮我建好库、表给我发过来的。在此,谢谢那位仁兄了。
接下来就是用 vs2005 和 access 数据库如何实现我同学的功能需求了,经功能分解程序主要有 3 个窗体和系统托盘功能。
<!-- [if !supportLists]-->1) <!-- [endif]-->FrmBill :票据信息维护、查看窗体;
<!-- [if !supportLists]-->2) <!-- [endif]-->FrmCompany :对方单位选取弹出对话框,维护票据信息时,需要选择对方单位;
<!-- [if !supportLists]-->3) <!-- [endif]-->FrmBank :承兑银行选取弹出对话框,维护票据信息时,需要选择承兑银行;
<!-- [if !supportLists]-->4) <!-- [endif]-->系统托盘:由于程序需要电脑启动时就启动,因此程序启动起来之后直接最小化到系统托盘中,检查是否有到期提醒日的票据,有的话告知用户。
综合 FrmBill 、 FrmCompany 、 FrmBank3 个窗体其实功能一样,都是数据的增、删、改和保存。考虑之下使用 ado.net 的 oledbadapter 来填充、更新数据。在我看来 oledbadapter 操作数据就做 4 件事情:
<!-- [if !supportLists]-->1) <!-- [endif]-->创建数据库连接;
<!-- [if !supportLists]-->2) <!-- [endif]-->构建 oledbadapter 实例;
<!-- [if !supportLists]-->3) <!-- [endif]-->绑定 oledbadapter 的 selectcommand, updatecommand, insertcommand, deletecommand ,这步操作最为关键;
<!-- [if !supportLists]-->4) <!-- [endif]-->调用 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); |
本文介绍了一个用于管理企业应收、应付票据的客户端小程序。该程序利用Visual Studio 2005和Access数据库实现了票据信息的录入、查看、更新,并通过系统托盘功能自动提醒到期需要承兑的票据,简化了票据管理流程。
2504

被折叠的 条评论
为什么被折叠?



