最近被迫进行了一次VB.NET开发。作为一次痛苦的回忆,有必要记录下来。
项目是一个报表改造项目,客户提供了旧项目的水晶报表RPT模板文件和新项目的SQL语句。
以前光玩Java和RoR了,从来没有接触过.net,第一次接触.net技术,经过请教后,制定了大概的思路与方向.
读取数据源->转变成自定义DateTable->和水晶报表绑定
因为由于本次项目连接的是Oracle,采用了OLDDB.NET的方式,所以需要安装Oracle的驱动包(100多兆呢),但由于因为最终要做成WebForm形式,所以希望的依赖包相对要求精简一些,就调整了一下项目结构,追加了WebService方式。
最终结构如下
'创建报表 Dim report As rpt_report1 = New rpt_report_1 '获取远程接口 Dim client As ServiceReferenceQuery.ServiceSoapClient = New ServiceReferenceQuery.ServiceSoapClient '调用远程接口,id和参数 Dim s As String = client.Query(Common.rpt_report1, DataFormatter.SerializeList(Me.Params)) '获取查询结构,也就是自定义DateTable report.SetDataSource(DataFormatter.DeserializeDataTable(s)) '与水晶报表模板绑定 MdiStaffCrpViewer.ReportSource = report
序列化问题: 我一开始考虑WebService传递数据最好是序列化DataTable,一查,新版果然支持。一用,序列化后没有列头信息,只有数据。这样不行,无法进行数据绑定。具体原因没有查出来。
只好自己弄了一个序列化的函数,最后还要在客户端反一下.
大数据量问题:由于是报表,所以可能存在数据量过大的问题,google 了一下,一般方案是进行数据zip一下。由于介绍采用的是c#调用第三方zip库的原因,本次项目就没有进一步优化。
DataTableName问题:序列化之前不设置TableName,会有错误提示的.
Dim TargetDs As DataTable = New DataTable With TargetDs.Columns .Add("s61_1", GetType(String)) .Add("s61_2", GetType(String)) .Add("s61_3", GetType(String)) .Add("s61_4", GetType(String)) .Add("s61_5", GetType(String)) End With
类型定义: 由于客户只提供了SQL语句,无法判定字段据具体类型, 只好采用无敌的String了。但个别字段在水晶报表中要参与运算必须设置成Integer,否则会保存。
1.和Java不同的是不光有connectionString还有一个Provider。刚转过来,不太了解其作用。
2.Oracle连接设置的话,需要建立一个alias,在oracle/product/10.1.0/Client_1/network/ADMIN/TNSNAMES.ORA,alias包括SERVICE_NAME/Service/Port,在connectionString中包含UserName,Pass,ailas.
3.连接Oracle的话用OleDbConnection/OleDbCommand/OleDbDataAdapter。
其他的也和Java差不多啦。
中间使用的时候查询了不少资料,关键点也就这几句话了。
因为这次是维护项目,没有新建报表的任务,也就不知道新建的具体流程了。说点知道的。
1.客户给的报表在设计期间可以预览。 并且有真实数据。第一次看到以为连接到了客户数据库上,大骂MS安全性太差,可是怎么也没有找到数据库链接......,后来才知道原来是缓存数据,可是缓存在哪里?
2.客户报表有的是一个报表对应多张表(一个DataSet多个DataTable),而新的SQL一般都是输出一个DataTable,只好修改报表数据源,n合1,然后才对上DataTable。
3.报表可以自己进行一些统计/分组,SQL文也可以实现相关功能。具体谁好,不太清楚,有经验的兄弟告知一下。
最后总结
1. 水晶报表确实很强大。
2. WebService第一次接触感觉不错。
3. vb.net语言太烂,没有存在的必要。
4. vs2008速度挺快,功能一般般。装个sp1比安装还慢。
5. WebForm思路不错,单机程序开发模式,Web发布方式。