FreeSQL还挺好用的,后续的新项目,用到数据库的,基本上都改用FreeSQL了。但是在FreeSQL的过程中,不可避免地踩过一些坑,分享出来供大家参考。
1、慎用UseAutoSyncStructure(true)功能,特别是一些老项目改造,和数据非常重要的项目。
UseAutoSyncStructure功能非常方便,FreeSQL会根据定义的数据类,自动生成数据库表和数据库字段。但使用不当,可能会造成数据丢失。
我之前踩过的坑是改成自己写的日志软件时遇到的,因为我的日志内容部分比较长,所有原来用的数据库字段类型是LongText,代码中数据类的字段类型是string。改造过程没去特别定义字段长度。出现的结果是,在MySQL数据库中,FreeSQL默认会把数据类型是string的字段,定义成类似长度256的varchar类型。然后FreeSQL把我原来的LongText类型直接改成了varchar(256),把原来日志内容超出的部分全删除了。相当于我前面写的所有的日志内容都只剩下256个字符了,欲哭无泪。
解决办法:
1)不要开启UseAutoSyncStructure自动迁移功能
freeSql = new FreeSql.FreeSqlBuilder() .UseConnectionString(type, connectionString) .UseLazyLoading(true) .UseMonitorCommand(cmd => Debug.WriteLine(cmd.CommandText)) //.UseAutoSyncStructure(true) .Build();
2)文本内容超长的字段,要定义一下字段长度,我一般直接把StringLength定义成-2,相当于就是LongText
[Column(IsNullable = false, StringLength = -2)] public string TaskContent { get; set; }
2、不同数据库切换时要小心。
FreeSQL封装得比较好,可以非常方便地匹配不同的数据库类型,所以我现在的小工具基本上都会同地支持MySQL和SQLite,同时支持切换数据库。
前面我弄的小工具ToDoManager,默认使用SQLite,但我平常都是使用MySQL。有一次,在调试过程中,在软件运行过程中,把数据库从SQLite切换到MySQL,但切换完以后没有从新数据库中重新加载数据。然后这个小工具,前面为了方便加了退出时自动保存的功能。导致的后果是,SQLite的空数据把MySQL里的有效数据全替换了,导致我MySQL里的数据基本上全丢了。
在工业自动化领域,我们经常使用第三方关系数据库作为历史数据存储的容器,以备后期数据维护,历史查询,历史趋势的获取,我们常用的第三方关系数据库有:ORCALE数据库,SQLServer数据库,MYSQL数据库。目前ORCALE数据库和MYSQL数据库都属于甲骨文公司,SQLServer数据库属于微软,目前很多上位机组态软件都是使用SQLServer数据库作为其历史数据存储的容器,如西门子的WINCC,而我们在使用过程中会发现有很多比方便。而鉴于MYSQL数据库体积小、运行速度快、总体成本低,尤其是开放源码这一特点,很多企业在使用中也会选择其作为数据存储的选择,下面将讲一下如何使用组态软件WINCC实现工业数据与生产数据的融合。第一,必须在MYSQL中首先建立一个数据库,在新建立的数据库中新建所需要的表(Table)如图:第二,在组态软件中新建一个工程,并打开后台组件,在后台组件中选择ADOmodule进入ADO属性配置,在这里需要配置组态软件与与MYSQL数据库的ODBC连接,选择MicrosoftOLEDBProviderforODBCDriver,下一步进入连接字符串设置窗口如下图:
当我们在谈论5G+旅游时到底在谈论什么……图/视觉中国在谈论5G将如何改变旅游之前,先要认识5G。简单来说,5G就是第五代移动电话通信标准,也称第五代移动通信技术,是4G之后的延伸。从特性上看,与4G相比5G带来最直观的提升就是网络速度会更快,能够连接的设备会更多,信息传送的延迟时间也会更短,5G网络的理论下行速度将达到10Gb/s。5G另一个明显区别前面几代技术的地方在于,包括4G之前都是先大规模部署网络然后再寻找、培育应用,而且是国外将技术发展成熟后国内才开始部署。到了5G时代国内与国外的技术标准、网络部署等是同步的,我国即是参与标准的制定方之一,也将是首批部署5G网络的国家之一。总之尽管目前关于5G已经讨论的相当热烈,但从根本上来说,5G还并不完善、存在需要进一步拓展明确的空间。所以5G究竟能够为其他行业做些什么,还需要跟行业需求方共同探讨摸索。从这一点来讲,5G使得通信行业与其他行业的联系更加密切,未来应用的范围也将会更加广泛,可以搭载更多行业技术,如人工智能、VR、AR、8K高清视频、自动驾驶、无人飞机等。5G就像是一条比4G更为宽广的高速公路,为各行业新技术的创新提供了最为
1、Android9.0应用迁移1.1概述在最开始针对速贷进行Android9.0版本的适配时,我使用的是真机是vivoX21A,将targetSdkVersion升到28,运行发现网络请求全报400BadRequest,查阅了网上针对android9.0网络请求问题的解决方案以及其他的一些迁移到Android9.0需注意的点(下文会讲到),做了些适配和调整,发现仍有问题,通过抓包也并没有发现问题的原因所在。随后试了下模拟器以及借来的googlepixel(9.0)真机运行了下,能正常使用,并没有发现什么问题,于是猜想是机子本身系统的问题。11.01更新:莫名又正常运行了。1.2Android9的迁移和适配在模拟器上的适配我这边做的不多,官网有比较详细的介绍: 将应用迁移到Android91.2.1针对Android9设备上运行的所有应用都有影响的关键变化有(列举了常用的,具体看官方文档):*对非SDK接口的限制:现已禁止访问特定的非SDK接口,无论是直接访问,还是通过JNI或反射进行间接访问。尝试访问受限制的接口时,会生成NoSuchFieldException和NoSuchMeth
Atitithotdeploy热部署法 dyncreloadv5v55 目录 1.1.Script引擎法 1.2.Debug模式启动推荐 1.3.Springboot热部署jar工具devtools 1.4.Mybatisreloadsqlfactory 1.5.Invokescriptphpjs法cli 2.Other 2.1.Cmdreloadsdk法 2.2.使用javaassit动态加载classloader工具 2.3.热部署 crontabkillandrestart 2.4.使用jsp 3.使用其他 Script引擎法Debug模式启动推荐 如果JVM运行时开启JPDA(JavaPlatformDebuggerArchitecture),则Class是运行被动态重新载入的。具体方式可以参考java.lang.Instrument。javassist也提供了一个运行期重载Class的方法,具体可以看API中的javassist.tools.HotSwapper。 新增加方法也支持reload类。。
文末有源码地址 添加依赖 <!--amqp依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>复制 创建所需常量类 publicclassRabbitMQConstant{ //简单模式 publicstaticfinalStringQUEUE_EASY="easy.queue"; //work模式 publicstaticfinalStringQUEUE_WORK="work.queue"; //topic模式 publicstaticfinalStringQUEUE_TOPIC_FIRST="topic.queue.first"; publicstaticfinalStringQUEUE_TOPIC_SECOND="topic.queue.second"; //发布订阅模式 publicstat
define('CorpID',"wx82e2c31215d9a5a7"); define('CorpSecret', "");//当前管理组设置->功能设置->权限管理->系统管理组->深圳管理(新建的管理组)->Secret define('AgentID', "20"); //当前应用ID require_once("../../class/wxqiye.class.php"); $weixin=newclass_wxqiye(); //var_dump($weixin); if(isset($_COOKIE["openid"])&&!empty($_COOKIE["openid"])){ $openid=$_COOKIE["openid"]; }else{ if(!isset($_GET["code"])){ $redirect_url='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $jumpurl=$weixin->oaut
1、Consumerraisedexception,processingcanrestartiftheconnectionfactorysupportsit.Exceptionsummary:org.springframework.amqp.AmqpConnectException:java.net.ConnectException:Connectionrefused 这个很明显,没有连接配置。增加一个配置文件。 (笨方式,测试用,实际可采用配置文件方式。) @Configuration publicclassRabbitMqConfig{ @Bean publicConnectionFactoryconnectionFactory(){ CachingConnectionFactoryconnectionFactory=newCachingConnectionFactory(); connectionFactory.setAddresses("192.168.0.0:5672"); connectionFactory.setUsername("nei"); connectionF
IOS两种常见的循环引用: 1,两个类之间互相定义对方的引用 如下: //ARCcode @interfaceA:NSObject @property(nonatomic,strong)B*b; @end @interfaceB:NSObject @property(nonatomic,strong)A*a; @end解决方法是,其中一个的属性用strong,一个用weak,如下:复制 //ARCcode @interfaceA:NSObject @property(nonatomic,strong)B*b; @end @interfaceB:NSObject @property(nonatomic,weak)A*a; @end2,Block中出现的循环引用复制 [self.tableViewaddPullToRefreshWithActionHandler:^{ self.isRefresh=YES; self.hideHud=YES; self.currentPage=0; [selfqueryCarFault]; }];如上,如果self要退出了,也就是dea
1248、统计优美子数组(Medium) 题目描述:给你一个整数数组nums和一个整数k。如果某个连续子数组中恰好有k个奇数数字,我们就认为这个子数组是「优美子数组」。请返回这个数组中「优美子数组」的数目。 示例1: 输入:nums=[1,1,2,1,1],k=3 输出:2 解释:包含3个奇数的子数组是[1,1,2,1]和[1,2,1,1]。 示例2: 输入:nums=[2,4,6],k=1 输出:0 解释:数列中不包含任何奇数,所以不存在优美子数组。 复制 解题思路: 解法一:暴力枚举 暴力枚举的方法同样可以枚举出所有的子数组,判断每一个子数组中奇数的个数,从而得到结果,时间复杂度最优为O(n^2),一般会超出题目的时间限制,不再赘述。 解法二:数学法 因为在这里我们只关心子数组中奇数的个数,对于有多少个偶数并不关心,因此,可以建立一个oddIndex数组,用以依次存储所有奇数的下标索引,那么对于oddIndex数组,其中的每一个元素oddIndex[i],都可以作为子数组的一个起点,并且[oddIndex[i],oddIndex[i+k-1]]就满足正好有k个
大一的时候没有好好学,后来都是要还的QAQ 大三重修了C语言(刷分)。再次遇到了全排列这道题,之前是直接抄的书上的代码,没有认真理解意思。在大二学习中也知道了全排列是依靠递归实现的,索性这次就没有参考文章,自己写了一个全排列出来。(代码运行效率看起来还可以) 核心思想是递归地交换两个数字。for循环意味着对level-1之后的数字遍历交换一次。 因为交换了数字,所以在递归出口的时候要把之前的交换还原。(想象整个过程,而不是细节就会明白) 写出来也挺简单的,十几分钟的事情orz,还是大一太佛了,没有认真学习,否则现在也不会这么艰难啊QAQ。 不说了不说了,最后附上代码: 输入:一个数字n,代表hash数组中的前几位参与全排列。 输出:数字的全排列,以从小到大的顺序排列,共$A^n_n$个 #include<stdio.h> inthash[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; intloc; voidprint() { inti; for(i=0;i<loc;i++) printf("%d",h
CREATEDEFINER=`root`@`%`FUNCTION`fristPinyin`(P_NAMEVARCHAR(255))RETURNSvarchar(255)CHARSETutf8 BEGIN DECLAREV_RETURNVARCHAR(255); SETV_RETURN=ELT(INTERVAL(CONV(HEX(left(CONVERT(P_NAMEUSINGgbk),1)),16,10), 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7, 0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB, 0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1), 'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z'); RETURNV_RETURN
usingMicrosoft.AspNetCore.Mvc; usingMicrosoft.Extensions.Configuration; usingSendEmailDemo.Models; usingSystem.Net; usingSystem.Net.Mail; usingSystem.Text; usingSystem.Threading.Tasks; namespaceSendEmailDemo.Controllers { [Route("[controller]/[action]")] [ApiController] publicclassHomeController:ControllerBase { privatereadonlyIConfiguration_configuration; publicHomeController(IConfigurationconfiguration) { _configuration=configuration; } publicasyncTask<IActionResult>SendQQEmail() { //读取
首先,返回有两个状态,status和code status标识response的状态,有2个值:0成功,-1服务错误。 code跟业务有关,可以有各种数值,99999服务未知异常,10000参数异常,100001创建订单失败等等。这两个状态用枚举类表示。 ResponseStatus /** *@Author:ivan *@Description:服务状态代码 *@Date:18/11/26 *@ModifiedBy; */ publicenumResponseStatus{ OK(0,"成功"), ERROR(-1,"服务错误"); privateintvalue; privateStringmessage; ResponseStatus(intvalue,Stringmessage){ this.value=value; this.message=message; } publicintgetValue(){ returnvalue; } publicStringgetMessage(){ returnmessage; } }复制 &nb
MySQL参数:innodb_flush_log_at_trx_commit和sync_binlog innodb_flush_log_at_trx_commit和sync_binlog是MySQL控制磁盘写入策略的重要参数. innodb_flush_log_at_trx_commit 当innodb_flush_log_at_trx_commit=0时,logbuffer将每秒一次地写入logfile,并且logfile的flush(刷新到disk)操作同时进行.此时,事务提交是不会主动触发写入磁盘的操作. 当innodb_flush_log_at_trx_commit=1时(默认),每次事务提交时,MySQL会把logbuffer的数据写入logfile,并且将logfileflush(刷新到disk)中去. 当innodb_flush_log_at_trx_commit=2时,每次事务提交时,MySQL会把logbuffer的数据写入logfile,但不会主动触发flush(刷新到disk)操作同时进行.然而,MySQL会每秒执行一次flush(刷新到disk
问题N:NumberMultiplication 题意: 给你m个M点,n个N点,M都是质数,N是和它相连的M的乘积,然后告诉你每个N点的值,求M点 直接对每个N分解质因数即可,测试欧拉筛筛到4e7再试除法在学校的OJ最多可以91分 然后看了官方题解,第一种推荐的是Pollard-Rho算法 然后找了一些资料 米勒拉宾素性检验 算法学习笔记(48):米勒-拉宾素性检验 米勒拉宾素性检验-视频 算法学习笔记(55):Pollard-Rho算法 算法竞赛专题解析(19):数论--质因数分解 下面是代码,摘自以上文章大佬们的代码 分解质因数 #include<iostream> #include<random> #include<cmath> #include<unordered_map> #include<set> usingnamespacestd; typedeflonglongll; typedef__int128_tlll; constintM=1e5+10; set<ll>prime; in
今天突然想打打splay,结果发现以前学的都忘光了,所以只能从头开始啦~ splay是基于二叉搜索树的结构,通过旋转来完成各种操作。 所以splay的基本性质: 左儿子的权值都小于父节点的权值,右儿子的权值都大于父节点的权值 splay的功能: 询问数的排名,查询k大的数,查询一个数的前驱和后继 时间复杂度均摊O(logn) 关于splay的具体实现: 结构体里 structnode { node*ch[2],*f; intsz,cnt,v; voidmaintain() { sz=cnt+ch[0]->sz+ch[1]->sz; } intcmp(intx) { if(x==v)return-1; returnx<v?0:1; } intdir() { returnf->ch[1]==this; } voidsetc(node*x,intd) { (ch[d]=x)->f=this; } }T[SZ],*root,*null;复制 各成员函数的作用: maintain():用来更新子树大小和当前数值的个数 cmp(
可做参考 https://www.cnblogs.com/OctoptusLian/p/9029492.html https://www.cnblogs.com/NEWzyz/p/8917660.html 4.1分而治之 练习4.1请编写前述sum函数的代码 defabb(arr): #iflen(arr)==1: #returnarr[0] ifarr==[]: return0 else: print("helloworld") returnarr[0]+abb(arr[1:]) print(abb([1,2,3]))复制 4.2 deflist_len(arr): ifarr==[]: return0 else: return1+list_len(arr[1:])复制 4.3 defmax_list(arr): iflen(arr)==1: returnarr[0] else: b=max_list(arr[1:]) ifarr[0]>b: returnarr[0] else: returnb print(ma