困惑了2年多的C#问题,终于解决了

翻了一下QQ聊天记录,其实这个问题也是困扰吉日嘎拉的问题,2015年我曾经就此问题跟他交流过。

在更新语句中和条件中有相同的参数问题,造成报错:

 The variable name '%.*ls' has already been declared. Variable names must be unique within a query batch or stored procedure.  

曾经我是先判断条件语句,获取到主键ID,然后再根据主键ID为条件进行更新,多了一次数据库读取,折中处理了好几年。

这次再写类似的程序,实在觉得这么搞太费劲,索性花了几个小时,最终的思路就是即便是同名的字段,条件语句的参数自动改名:增加后缀或前缀。

这么一改,条件的参数就自动增加了后缀Where,就跟更新字段的参数不重名了。当然了你也可以自定义自己的后缀或者前缀。

最终时隔2年多,将此更改跟吉日嘎拉再次沟通,也解决了他的困惑,皆大欢喜。

有在用吉日嘎拉底层DotNet.Common数据读写层的朋友,请拿去不谢。

吉日嘎拉DotNet.BusinessV4.2中的一处bug,及我的修复和扩展

bug所在位置:DotNet.Business\Utilities\BaseManager.GetDataTableByPage.cs的函数

public virtual DataTable GetDataTableByPage(out int recordCount, int pageIndex = 0, int pageSize = 20, string sortExpression = null, string sortDire = null, string tableName = null, string conditional = null, IDbDataParameter[] dbParameters = null, string selectField = null)中。当使用自己定义的查询语句作为tableName传递进来的时候,按照逻辑没有使用存储过程进行分页,但是很明显那个传递的conditional和dbParameters都被用来统计了总记录数,但是以下调用语句并没有传递conditional。

return DbLogic.GetDataTableByPage(DbHelper, recordCount, pageIndex, pageSize, tableName, dbParameters, sortExpression, sortDire);

于是我扩展了那个DotNet.Business\Utilities\Extend\DbLogic.GetDataTableByPage.Extend.cs,增加了函数

public static DataTable GetDataTableByPage(IDbHelper dbHelper, int recordCount, int pageIndex, int pageSize, string sqlQuery, string conditional, IDbDataParameter[] dbParameters, string sortExpression = null, string sortDire = null)

这里的逻辑是,多表查询构造一个viewTable,然后将where查询直接传递到viewTable里面,而不受分页的影响。上个月扩展了此函数,今天正式升级服务器程序的时候,还是出现了问题,于是有了以上函数的完善版本。上个月是将where条件放在了最外面,造成ROW_NUMBER范围内的所有记录都没有指定where条件的记录,造成用户看记录的时候明明有,显示不出来。当然,这个扩展的函数仅仅是扩展了MSSQL的数据库,有类似使用的朋友可以参考。

吉日嘎拉C#快速开发平台V4.0到V4.2升级记

目前我用的版本是4.0的,也有近2年没更新了,狠了狠心升级一下,没想到真的行动起来,也没那么难!

用了3天时间,将吉日嘎拉的代码升级到了4.2版本,并让原来的DotNet.WebApplication正常运行起来,比料想的顺利。这里简单记录一下升级中的心得。

使用到的工具:

1、BeyondCompare 试用版 – 比较程序文件

2、SQLDelta 14天试用版 – 比较数据库表结构变化(及数据变化)

3、VS2010 – 保证升级后WebApplication好用

4、MSSQL 2008 R2 – 标配数据库

最新代码的亮点:

1、分离出了DotNet.Model

2、分离出来DotNet.IService

3、DotNet.Business新增Redis缓存

4、DotNet.Utilities新增众多BaseSystemInfo参数和底层函数:数据库读写分离等

5、新增DotNet.UserCenter,用于其它程序如WebApp、安卓、苹果端调用

6、用户登录日志表完善、强大

7、数据库访问增加跟踪及底层文本日志

8、增加DotNet.MVC项目,BS端的用户及权限管理(还未研究)

相关截图:

1、数据库UserCenter更新

2、项目及解决方案截图

注意事项:

1、SqlDelta生成部署的代码后,还需要手动更新老记录中一些字段的值

UPDATE [UserCenterV40].[dbo].[BaseUser]
SET IsAdministrator=1,UserName='Administrator',NickName='Administrator'
WHERE UserName='Admin'
UPDATE BaseModule SET AuthorizedDays=0
UPDATE BaseUserLogOn SET OpenIdTimeout = GETDATE() 
UPDATE BaseUserContact SET MobileVerificationDate = GETDATE()

2、DotNet.WebApplication中有很多登录及读取权限的函数需要更新BaseSystemInfo.SystemCode

本文是升级记录的第1篇,后继会继续记录研究DotNet.MVC项目后的心得,敬请期待。

后记:请大家不要问我要源码,如需购买请直接联系吉日嘎拉,他的博客园的主页地址:http://www.cnblogs.com/jirigala/