升级VS2019 16.11.5引起的error CS0246: The type or namespace name ‘FieldDescription’ could not be found (are you missing a using directive or an assembly reference?)

昨晚上看到VS2022的新的Preview版本发布,就连同VS2019一起升级到了最新版。

可没想到的是,我有个项目中的DLL引用就开始编译报错了。

昨晚上弄了几个小时,删掉引用,重新添加也不行。从GitHub上下载老版本同样编译报错。

找同事试了一下,他用的老版本的VS 2019,没有编译问题。

那可以肯定的是我本地VS2019的问题!

于是上午用VS2022打开编译,同样也是报错。

后来我就到Project属性当中看到Reference Path,以前也没关注过这个的。尝试着增加了我外部引用的DLL路径。

你猜怎么着?

没报错了!

我看了一个修改后的GitHub的Git Changes提示也没有,原来这个设置是保存在了csproj.user文件中。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProjectView>ShowAllFiles</ProjectView>
  </PropertyGroup>
  <PropertyGroup>
    <ReferencePath>E:\Github\DotNet.WangCaiSoft\src\DLL\DotNet\</ReferencePath>
  </PropertyGroup>
</Project>

难道是我的ToolsVersion为Current的缘故?

哪位高手如果碰到类似情况,不让忘记这个error CS0246的报错,看看你的Reference Path增加上是否就解决了。

我还有一个猜测,就是我同时也安装了VS2022预览版的缘故?

Infor LN ERP在线帮助、用户手册

又有新同事来问我有没有LN ERP的宝典,可以学习一下的。

除了让他看已经录制的微课短视频以外,还提示他善用F1来看实时的帮助文件。

最后我推荐他到Infor的官方网站来看Infor Documentationhttps://docs.infor.com/zh-cn/,这里以中文版为例,登录进去以后长这样:

然后选择ERP & Finance下的LN

这时候,你可以选择合适的ERP版本了,截止发文时间,默认是CE

你会发现有3个链接,分别对应

Infor LN UI 用户手册简体中文2021-04-29
Infor LN 联机帮助简体中文2021-07-13
Infor LN Documentation List CEEnglish2021-07-02

我们切换到10.4,也是我现在用的版本

Infor LN ERP 10.4在线手册:https://docs.infor.com/zh-cn/ln/10.4

当然了你还可以切换到其它版本,我都帮你列好了!

Infor LN ERP 10.7在线手册:https://docs.infor.com/zh-cn/ln/10.7

Infor LN ERP 10.6在线手册:https://docs.infor.com/zh-cn/ln/10.6

Infor LN ERP 10.5在线手册:https://docs.infor.com/zh-cn/ln/10.5

Infor LN ERP 10.5在线手册:https://docs.infor.com/zh-cn/ln/10.3

非常规方式处理Oracle+.NET开发全球化的时区显示

咨询了几个大牛有关.NET开发中全球化的时区显示问题,大家的意见有三个:

1、使用UTC Time记录到数据库,展示的时候根据用户所选择的时区进行转换展示
2、使用固定时区DateTime记录到数据库,展示的时候根据用户所选择的时区进行转换展示
3、记录timestamp到数据库,选择DateTime.UTCTime转为秒或毫秒级别的timestamp,展示的时候转为时间类型,并根据用户所选择的时区进行转换展示

大部分人喜欢1,其次是3,最后是2

而我今天要分享的这个Oracle数据库下的开发,有个前提就是我不能修改数据库,也不能修改写入数据库的时间是指定时区的,因为Infor LN ERP中更新此时间字段,幸运的是它本来就是UTC Time。

但是呢,我不能直接用第1条方案,因为我有些筛选条件,根据用户的日期(时间)还需要筛选数据,那么我不想:既修改展示阶段的时间时区,又修改查询时候的输入时间。

于是就有了今天的非常规方案:sessiontimezone

当我们在Oracle数据库中执行以下SQL时,可以知道数据库的时区和我当前连接的时区。

SELECT BTIMEZONE,SESSIONTIMEZONE,TZ_OFFSET(DBTIMEZONE),TZ_OFFSET(SESSIONTIMEZONE) FROM DUAL;

那么我们就可以使用:TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24,来动态的展示当前连接所在时区的时间了

SELECT TO_CHAR(A.T$CNFT + TO_NUMBER(SUBSTR(TZ_OFFSET('" + GetUserTimeZone() + "'),1,3))/24, 'YYYY-MM-DD HH24:MI:SS') AS ConfirmedTime FROM MYTABLE A

此处的GetUserTimeZone就是根据当前用户的市区设置,读取到一个“-5:00”或”6:00″形式的TimeZone。

至于用户的时区是根据用户所属的国家来还是根据用户的个人设定,这里的逻辑可以灵活设定优先级。

虽然非常规方案可以满足需要,但是不具备普遍性,性能上也会很依赖Oracle数据的配置。

如果您碰巧也有类似的场景,不妨试试这个方案。

.net framework 4.0的NuGet包制作

为啥做这个呢,因为要将公司内部的老的.NET程序所引用的DLL进行统一管理。这里服务端使用了一个叫做NuGetServer(官网:NuGet Server)的开源工具,部署在内部的Web服务器上。

制作NuGet包,我是先从.NET Standard 2.0的SDK风格的文件去创建的,特别容易。但是.NET 4.0这种废了好大周折!

试过直接通过DLL生成,但是会遇到包描述、版本等信息不自动更新的问题,最重要的DLL所引用的NuGet.org的包,不能自动包含进去。

也试过通过命令行进行每个单独的Project进行生成,也遇到包描述、版本等信息不自动更新的问题。NuGet.Org的包没问题。

最后呢使用Tools>External Tools(工具>外部工具)定义了一个命令。

要确保MSBUILD和NUGET好用,需要找到系统环境变量,添加路径(记得重启电脑,以便生效)。

找到Path项
1、增加:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin
2、增加:E:\VS\DotNet.WMS.US\DLL\DotNet

第一个是MSBuild,如果你是VS 2019社区版,直接复制,如果不是,请找到相应的路径。
第二个是NuGet.exe的目录,请选择您自己的目录。

这块设置参考这篇文章:https://www.cnblogs.com/chenug/p/9290281.html

命令:del *.nupkg ; $roj=dir *.csproj ;MSBuild $roj; nuget pack $roj ; $nupkg= dir *.nupkg;
执行目录选择$(ProjectDir)

需要生成的时候,点击一下要生成的Project,然后就可以点击Tools > 4.0NuGet命令

稍等片刻就生成了。

这样生成的包在Project的根目录,但是版本和描述信息呢都不对,请自动修改文件名和文件内部的描述文件内容。

用啥软件打开,7-ZIP即可,因为包就是一个压缩包。

2021开始用DBeaver连接各种数据库:强烈推荐这款免费开源的通用数据库工具

平常用微软的SQL Server(MSSQL)数据库最多,用的是微软的SQL Server Management Studio (SSMS) 客户端,免费的。

Oracle使用频率次之,用的是它自家的Oracle SQL Developer,也是免费的。

MySQL数据库使用的最少,用得是以前介绍过的SQLyog,免费试用版,过期了也不用了。

最近又要连接MySQL数据库了,听说Navicat for MySQL不错,企业版永久授权活动价也就1600多块钱。但用得实在不多,就懒得买了。

在捣鼓Ubuntu Server的虚拟机下Ngnix的过程中,安装了Ubuntu Desktop版本,通过其App Store找到了DBeaver CE(Community Edition社区版),评价很高,并且免费开源。

在Ubuntu下体验了一下,还挺不错,支持很多数据库,使用时自动下载相应的数据库驱动。

于是在Windows下就正式启用了,下载的速度不快,官网是:DBeaver Community | Free Universal Database Tool

这款软件定位是免费开源的通用数据库工具:为开发者、数据库管理员、分析师和所有需要使用数据库的人提供免费的多平台数据库工具。支持所有流行的数据库:MySQL、PostgreSQL、SQLite、Oracle、DB2、SQL Server、Sybase、MS Access、Teradata、Firebird、Apache Hive、Phoenix、Presto等。

软件是基于Java开发的,所以支持跨平台:Linux、Windows、Mac都支持。除了社区版和企业版,它还有云端的基于浏览器的版本。

安装后首次运行会问你要不要创建一个SQLite的示例数据库,用于探索软件。这个引导功能做的挺赞,必须赞一下。

我试了访问MySQL、SQL Server,体验挺不错的,第一时间就把过期的SQLyog删除了。

后续我会深度用一下它的MySQL和Oracle连接数据库,请关注后续更新。

如果你也有类似管理MySQL的需要,不妨试试这款DBeaver:非常强大易用的数据库管理和开发工具。

Oracle中如何获取当年第几周、第几天,当月第几周、第几天等

最近弄有关标签上的日期码DATECODE,遇到了自动生成的问题,这个呢可以在C#程序中根据日期自动生成,也可以通过数据库生成。今天先介绍下数据库生成,这里用Oracle数据库。

先来说一下需求:日期格式需要取年的后两位+月份转为A-L+当月第几周,如21I1就是今天的日期码。

相应的Oracle SQl语句如下:

SELECT TO_CHAR(SYSDATE, 'YY')||
DECODE(TO_CHAR(SYSDATE,'MM'),'01','A','02','B','03','C','04','D','05','E','06','F','07','G','08','H','09','I','10','J','11','K','12','L','MM')||
TO_CHAR(SYSDATE,'W') AS DATECODE FROM DUAL;

可能你会问,这个周是9月份的第二个周了,为啥显示为第1周?

有必要把一些常用的SQl解释下。

SELECT TO_CHAR(SYSDATE, 'w') FROM DUAL; --1个月中的第几周
(从每月1号开始算,日期+6天为每1周结尾)
SELECT TO_CHAR(SYSDATE, 'ww') FROM DUAL; --1年中的第几周(每年1月1日为第1周开始,日期+6天为每1周结尾)
SELECT TO_CHAR(SYSDATE, 'iw') FROM DUAL; --1年中的第几周(星期一至星期日算1周,且每年的第一个星期一为第1周)
SELECT TO_CHAR(SYSDATE, 'd') FROM DUAL; --1周的第几天
SELECT TO_CHAR(SYSDATE, 'day') FROM DUAL; --当前日期是星期几,可设置显示英文还是中文
SELECT TO_CHAR(SYSDATE, 'ddd') FROM DUAL; --1年中第几天
SELECT TO_CHAR(SYSDATE,'q') FROM DUAL; --1年中第几季度

已提交的文件在.gitignore加入忽略规则不生效原因和解决

上次介绍过《GitHub Desktop清除本地缓存》,现在VS2019和VS2022自带了Git的功能,一般不需要安装GitHub Desktop了,但遇到类似的“Git-忽略规则(.gitignore配置)不生效”或者“解决已提交的文件在.gitignore中加入忽略后无效的问题”

这里介绍另外一种处理办法,那就是安装Git的命令行客户端:http://git-scm.com/download/win

安装完毕后,找到你的源码仓库所在文件目录,鼠标右键点击,选择Git Bash Here。

会看到如下弹出的界面

输入如下命令:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

执行完毕,就搞定了!

解释一下这3行代码的意思:

1、删除本机的Git缓存(Git的记录,而不是文件本身)
2、将所有文件重新提交
3、提交到本地当前分支

手贱玩坑自己填:ExecuteNonQuery返回-1

最近手贱,将Oracle.ManagedDataAccess升级到19.12.0,原来运行正常(其实有问题)的代码忽然出问题了。

后来一条是发现所有BEGIN END包裹的UPDATE语句,现在都是返回-1,而不是想要的影响的行数了。

其实我所使用的DotNet.Util的底层类库中ExecuteNonQuery();默认值就是-1.

var result = -1;

并且呢,本来ExecuteNonQuery()在执行UPDATE、INSERT以及DELETE语句时,返回值为该命令所影响的行数。这是这个方法的建议用法。

如果用这个执行SELECT语句,不会返回影响的行数或者记录,而返回-1,不论查询结果有没有记录都会返回-1。

同理,如果执行任何CREATE、ALTER、TRUNCATE创建/修改/删除表、字段、索引等语句,同样返回-1。

既然明白了原理,但还得使用一次性多个SQL一起执行,没办法的办法,只能硬着头皮,用个馊主意。

针对BEGIN END的调用,明确知道包含BEGIN END的,就返回一个绝对值,代表成功了。

//return result;
//return -1 if BEGIN END
return Math.Abs(result);

我知道这样做不对,不好。

谁有好办法,分享下。

比方说现在EF里面的做法,或者ORM这些怎么处理的?

等我有时间去研究下SqlSugar或者FreeSql这类ORM看看他们怎么处理的。

跟老板学管理#4:人和企业搞钱的办法只有6种!

有一天一个大佬老板酒喝多了,吐真言说:如果知识真得可以换取最大的财富,那么中国富豪榜上的富豪们都应该是博士、博士后、院士。而如果勤劳真得可以致富,那中国首富、世界首富一定是一头牛或者一头驴。

接着问我:你看很多人整天嚷嚷着我要赚钱,我要搞钱。你知道世界上搞钱的方法有哪些吗?

我笑而不语,因为我真不知道。

他接着说:要么去抢,要么去偷,要么去骗,要么去赌,要么去捡,要么去解决问题、创造价值,你就能变得富有。

我一听:怎么有那么多种?

他见我迟疑了一下,继续补充道:这6个方法中,除了最后一个,其它的全部是非法或者犯法的。所以呀,最终方法只要一个:用点心,关心身边的一切,找到一个你能解决的问题,并且想办法,把你的解决方案不断的优化、深入、放大、复用,为了解决问题而学习,并不断探索、运用工具来放大收益,这才是获取财富的正确办法。

我频频点头,他继续补充道:你看看周边的例子,那些赚了大钱的怎么解决问题、创造价值的?

当时就这个话题,他也举了很多例子,我愈加相信这个总结的普适性。

你认同吗?

宝塔居然没有自动续签Let’s Encrypt证书

要不是大伟提醒,我还不知道呢。

居然5月5日就过期了。

这两个月,个人博客没更新,因为发现写微信公众号的方式太容易了,手机上安装一个公众号助手,就可以写文字了、发图片、发视频了。

好了,您可以拿起手机,扫码关注下我的公众号了。

也看看我最近两个月的更新(* ̄︶ ̄)。