From e42dc17cacbdbb091e4956ad4174af6a205a9f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=88=E3=83=BE=E9=AD=82?= <283591387@qq.com> Date: Mon, 12 Sep 2022 12:54:44 +0000 Subject: [PATCH 1/3] update README.md. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 靈ヾ魂 <283591387@qq.com> --- README.md | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 16a5b732..3083efa3 100644 --- a/README.md +++ b/README.md @@ -38,73 +38,73 @@ ## App/H5开发 - http://v2.volcore.xyz/app/guide ## 框架移动端(uniapp)已发布,同样全自动生成代码 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/qrcode.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/m001.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/m002.png) +![Home](/imgs/qrcode.png) +![Home](/imgs/m001.png) +![Home](/imgs/m002.png) ## 框架已支持Vue3版本 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/v3.png) +![Home](/imgs/v3.png) ## 框架已增加低代码设计器 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/fd01.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/fd02.png) +![Home](/imgs/fd01.png) +![Home](/imgs/fd02.png) ## 框架2.0已更新(部分新增功能截图) 增加切换皮肤功能 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/h.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/home_them.png) +![Home](/imgs/h.png) +![Home](/imgs/home_them.png) 增加可复用的后台请求参数校验 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/validator.png) +![Home](/imgs/validator.png) 增加树形菜单与代码生成页面使用 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/x7tree.png) +![Home](/imgs/x7tree.png) 增加文本编辑器直接发布静态页面功能 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/editor.png) +![Home](/imgs/editor.png) 一对一多从表显示(只需要少量代码就可完成成,其他都由代码生成器生成) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/m1.png) +![Home](/imgs/m1.png) 表合并显示 (只需要几行代码完成代码生成器生成的页面实现扩展) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/span.png) +![Home](/imgs/span.png) 从图上传图片 (只需要几行代码完成代码生成器生成的页面实现扩展) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/p1.png) +![Home](/imgs/p1.png) 一对多从表(不限从表数量)扩展 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/multi.png) +![Home](/imgs/multi.png) 图表 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/charts.png) +![Home](/imgs/charts.png) ## 1、只读基础表单 整个只读的基础表单的所有前后端代码,全部由代码生成器生成,代码生成器中几乎不需要配置,并支持并后端业务代码扩展,直接生成代码后,配置菜单权限即可 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/table1.png) +![Home](/imgs/table1.png) ## 2、自动绑定下拉框数据表单 整个自动绑定下拉框数据表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,在代码生成器中只需要指定数据源编号,页面加载时会根据编号自动加载数据源并绑定 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/table2.png) +![Home](/imgs/table2.png) ## 3、启用图片支持、审核表单 整个启用图片支持、审核表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,审核功能需要在菜单配置权限、代码生成器中勾选启用图片支持 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/table3.png) +![Home](/imgs/table3.png) ## 4、高级查询 整个表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,查询字段、类型(下拉框、日期、TextArea等)、所在行与列都由代码生成器完成,不需要写任何代码 - ![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/tablesearch4.png) + ![Home](/imgs/tablesearch4.png) ## 5、主从表新建、编辑 主从表新建、编辑所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,新建、编辑从表配置、字段、类型(下拉框、日期、TextArea等)、所在行与列、字段是否只读、标签显示的长度等都由代码生成器完成,不需要写任何代码 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/editTbale2.png) +![Home](/imgs/editTbale2.png) ## 6、excel导入 excel导入整个页面都由代码生成器生成,导入的字段、字段是否必填,下载模板也由代码生成器上配置(自己根据实际需要决定是否采用此方法),导入时会验证是否为空与数据的合法性,逻辑校验自己实现扩展方法即可 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/importTable1.png) +![Home](/imgs/importTable1.png) ## 7、H5开发 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/h5.jpg) +![Home](/imgs/h5.jpg) ## 8、权限分配 目前只实现了对用户的角色的Action进行权限分配 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/auth.png) +![Home](/imgs/auth.png) ## 9、代码生成器 代码生成器提供了20多种可配置的属性,可灵活配置显示、查询、编辑、导入、导出、主从关系等功能点击看代码生成器文档 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/coder.png) +![Home](/imgs/coder.png) 其他功能。。。。。 -- Gitee From 71da7ee00ae527df07f629ba511578e753937be7 Mon Sep 17 00:00:00 2001 From: liushoushan_notebook Date: Tue, 13 Sep 2022 16:15:53 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=94=AF=E6=8C=81sqlite?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VOL.Core/DBManager/DBServerProvider.cs" | 7 ++++++- .../VOL.Core/Dapper/SqlDapper.cs" | 10 ++++++++++ .../VOL.Core/EFDbContext/VOLContext.cs" | 5 ++++- .../VOL.Core/Enums/DbCurrentType.cs" | 3 ++- .../VOL.Core/VOL.Core.csproj" | 1 + DB/sqlite/vol.db | Bin 0 -> 360448 bytes 6 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 DB/sqlite/vol.db diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" index 704075ce..5373516d 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" +++ "b/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; using MySqlConnector; using Npgsql; using System; @@ -73,6 +74,10 @@ namespace VOL.Core.DBManager { return new NpgsqlConnection(connString); } + if (DBType.Name == DbCurrentType.sqlite.ToString()) + { + return new SqliteConnection(connString); + } return new SqlConnection(connString); } diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" index b87f9cc5..99286436 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" +++ "b/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" @@ -754,9 +754,19 @@ namespace VOL.Core.Dapper PGSqlBulkInsert(table, tableName); return table.Rows.Count; } + if (DBType.Name == "sqlite") + { + sqliteBulkInsert(table, tableName); + return table.Rows.Count; + } return MSSqlBulkInsert(table, tableName, sqlBulkCopyOptions ?? SqlBulkCopyOptions.KeepIdentity); } + private void sqliteBulkInsert(DataTable table, string tableName) + { + //待实现 + } + /// ///大批量数据插入,返回成功插入行数 //// diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/EFDbContext/VOLContext.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/EFDbContext/VOLContext.cs" index 80270e83..39abe586 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.Core/EFDbContext/VOLContext.cs" +++ "b/.Net6\347\211\210\346\234\254/VOL.Core/EFDbContext/VOLContext.cs" @@ -80,7 +80,10 @@ namespace VOL.Core.EFDbContext { optionsBuilder.UseNpgsql(connectionString); } - else + else if(Const.DBType.Name == Enums.DbCurrentType.sqlite.ToString()) + { + optionsBuilder.UseSqlite(connectionString); + }else { optionsBuilder.UseSqlServer(connectionString); } diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/Enums/DbCurrentType.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/Enums/DbCurrentType.cs" index a703fbaa..e4b4a010 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.Core/Enums/DbCurrentType.cs" +++ "b/.Net6\347\211\210\346\234\254/VOL.Core/Enums/DbCurrentType.cs" @@ -9,6 +9,7 @@ namespace VOL.Core.Enums Default = 0, MySql = 1, MsSql = 2,//2020.08.08修改sqlserver拼写 - PgSql = 3 + PgSql = 3, + sqlite=4, } } diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/VOL.Core.csproj" "b/.Net6\347\211\210\346\234\254/VOL.Core/VOL.Core.csproj" index d4375495..7645e6ee 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.Core/VOL.Core.csproj" +++ "b/.Net6\347\211\210\346\234\254/VOL.Core/VOL.Core.csproj" @@ -47,6 +47,7 @@ + diff --git a/DB/sqlite/vol.db b/DB/sqlite/vol.db new file mode 100644 index 0000000000000000000000000000000000000000..f8df55e8ca0d888355afd58e95faa52bcf8df1b7 GIT binary patch literal 360448 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 z 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⁡gsCjh%H$Llbnew}u;JyiuVCC}1NAJA#@SXcrg`k=3NfR66 zm0MTtG4YlE(abin?aYadO(xojZA`Zez$eUXr>BW}(%p{_zAfBq`F9#4szg39>nmpt zDaM+!8x#BstZmXgbA~(PzXRv z_}8Hte0THx%@;S`h8uVx0VIF~kN^@u0!RP}Ac6BnVEmch#ogT(uJ-$NUNh&ok&b30 z*CrvtrG{9^Em4XZ#_}vJQWNq8d?rGF*p&3wYDI1)DbFc#gwmGJqUqDvB?t+y-2u=QzDEjh=CIZNNNQ& zS{SKQ8DiCmAcm76Mc0>W%l?Z{g0Weh*xoNQ!?oC+X<{-?iH=#SxwE;|?rCf<1EWsb z{^f<3{`?AN= zJl(y#z2pzf_gO1ak;D1h6l7v%HN;xbf+R^U2&Y09d6F?9;}F64^k!_K9mGh$sr6YZ zAhbj)PHX}(6L|p=G|12t;!au*1(?ap>WV+LfbUQ}A2jk+FUb3b^rsC;n52b@87WK- zAsXCTkeA_90s-+WT!8QmX*K?{hFA!V$+eb5>ntY1W(i3hL@A^RS81vWlN6@4A$911 zzQQ=L`=?J z`0ay7KYE)P{kZdGYCEUV9aPNoe%Z_UrQ`G`jw4i@N*i+`ih{up2#J9hgMy@KS_n7_ zLNFI3=bv^QmoW;Yp%WRLpCh=0H_cN8Q6Y+Q2y4-4VOx369H(js-HGQL;`RU4Xs_1) z&*d=3Mj-(tfCP{L5@PnvF5EYAQxvB~o~?4%rQ z)#A%c>>7*pR9~9YEszK4;m#T7+0}yOfK3vTDIWM35PZF(oG<@xrBu1(|%~U&Px|&jcN>333@c+ zjuVy3oPaC}CjmI6p)-sXA}+McAjigHgx~2vZD~|(al>=6wVB1x4Rq2CjAn*OmJliv z&_+SMB#8pWIL=e&gwP^QlSO&XV=O+a8>W85&BOb@{_qD6K6>jHkKVsmozP#ma$1S% zalBf#5)K@Ijoh;dlxA8cMVu3>oY(d>Y}_v>q&R`(CTT*I$qf`2BV@OdOk;0sx#6UXN1>|1PCXa2#lv&uY4w{J?gO)B$onxu#95Hh;PRf5%0wzzI zeH=ZE z{t^8x`b+f3==afk(Yw(vqn}3iqGR|qUPu55AOR$R1dsp{Kmter2_OL^fCP}h(-G)h zTJ6(BAN2-RiH&-jRf&#z8&xSDb=Oxr&n?}tqi(+}m{GS^7WAmw hEemSYy-*h9sJm7c#HhPk7Wk;UQWn^#yIdCN=-;JW!OQ>v literal 0 HcmV?d00001 -- Gitee From cd6d1b8d1c11c77159e44c34a15ed951d977681a Mon Sep 17 00:00:00 2001 From: liushoushan_notebook Date: Tue, 13 Sep 2022 16:57:18 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=AE=9E=E7=8E=B0sqlite=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=86=99=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Partial/Sys_TableInfoService.cs" | 68 +++++++- .../VOL.Core/DBManager/DBServerProvider.cs" | 6 + .../VOL.Core/Dapper/SqlDapper.cs" | 27 ++++ .../VOL.Core/Utilities/SQLiteBulkInsert.cs" | 153 ++++++++++++++++++ .../VOL.WebApi/appsettings.json" | 7 +- DB/sqlite/vol.db | Bin 360448 -> 368640 bytes 6 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 ".Net6\347\211\210\346\234\254/VOL.Core/Utilities/SQLiteBulkInsert.cs" diff --git "a/.Net6\347\211\210\346\234\254/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs" "b/.Net6\347\211\210\346\234\254/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs" index cfde8f0c..1e0b61b9 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs" +++ "b/.Net6\347\211\210\346\234\254/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs" @@ -301,7 +301,16 @@ DISTINCT sql = GetSqlServerModelInfo(); break; } - List tableColumnInfoList = repository.DapperContext.QueryList(sql, new { tableName }); + bool issqlite = DBType.Name == DbCurrentType.sqlite.ToString(); + List tableColumnInfoList; + if (issqlite) + { + tableColumnInfoList = sysTableInfo.TableColumns.Select(e => new TableColumnInfo() { + ColumnType = e.ColumnType, ColumnName = e.ColumnName, + }).ToList(); + + }else + tableColumnInfoList = repository.DapperContext.QueryList(sql, new { tableName }); List list = sysTableInfo.TableColumns; string msg = CreateEntityModel(list, sysTableInfo, tableColumnInfoList, 1); if (msg != "") @@ -369,6 +378,10 @@ DISTINCT { sql = GetPgSqlStructure(tableName); } + else if (DBType.Name.ToLower() == DbCurrentType.sqlite.ToString().ToLower()) + { + sql = GetSqliteStructure(tableName); + } else { sql = GetSqlServerStructure(tableName); @@ -376,6 +389,11 @@ DISTINCT return sql; } + private string GetSqliteStructure(string tableName) + { + throw new NotImplementedException(); + } + /// /// 将表结构重新同步到代码生成配置 /// @@ -1262,6 +1280,7 @@ DISTINCT if (tableId > 0) return tableId; bool isMySql = DBType.Name == DbCurrentType.MySql.ToString(); + bool issqlite = DBType.Name == DbCurrentType.sqlite.ToString(); Sys_TableInfo tableInfo = new Sys_TableInfo() { ParentId = parentId, @@ -1272,7 +1291,52 @@ DISTINCT FolderName = foldername, Enable = 1 }; - List columns = repository.DapperContext + List columns; + if (issqlite) + { + + columns = new List(); + var sqlitetable_info = DBServerProvider.SqlDapper.QueryDynamicList($"pragma table_info([{tableName}])", new { }); + foreach (var item in sqlitetable_info) + { + string sqliteType = item.type.ToString(); + string cType = "string"; + int cLength = 0; + if (sqliteType.ToLower().Contains("text")) + { + cType = "string"; + cLength= sqliteType.ToLower().Replace("text(","").Replace(")","").ToInt(); + } + else if (sqliteType.ToLower().Contains("integer")) + { + cType = "int"; + + } + else if (sqliteType.ToLower().Contains("real")) + { + cType = "double"; + } + var column = new Sys_TableColumn() + { + TableName = tableName, + ColumnName = item.name, + ColumnCnName = "", + ColumnType = cType, + Maxlength = cLength, + IsKey =int.Parse(item.pk.ToString()), + IsDisplay = 1, + IsColumnData = 1, + ColumnWidth = 150, + OrderNo = 0, + IsReadDataset = int.Parse(item.pk.ToString()), + IsNull = item.notnull == 1 ? 0 : 1, + }; + columns.Add(column); + } + + } + else + columns = repository.DapperContext .QueryList(GetCurrentSql(tableName), new { tableName }); int orderNo = (columns.Count + 10) * 50; diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" index 5373516d..6468c6e1 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" +++ "b/.Net6\347\211\210\346\234\254/VOL.Core/DBManager/DBServerProvider.cs" @@ -103,6 +103,12 @@ namespace VOL.Core.DBManager { return new NpgsqlConnection(connString); } + + if (dbCurrentType == DbCurrentType.sqlite) + { + return new SqliteConnection(connString); + } + return new SqlConnection(connString); } diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" index 99286436..ecfffa87 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" +++ "b/.Net6\347\211\210\346\234\254/VOL.Core/Dapper/SqlDapper.cs" @@ -1,5 +1,6 @@  using Dapper; +using Microsoft.Data.Sqlite; using MySqlConnector; using System; using System.Collections.Generic; @@ -765,6 +766,32 @@ namespace VOL.Core.Dapper private void sqliteBulkInsert(DataTable table, string tableName) { //待实现 + using (var Connection = new SqliteConnection(_connectionString)) + { + if (Connection.State != ConnectionState.Open) + Connection.Open(); + SQLiteBulkInsert sbi = new SQLiteBulkInsert(Connection, tableName); + for (int i = 0; i < table.Columns.Count; i++) + { + DbType dbType = DbType.String; + if(table.Columns[i].DataType==typeof(string)) + { + dbType = DbType.String; + }else if (table.Columns[i].DataType == typeof(int)) + { + dbType = DbType.Int32; + } + else if (table.Columns[i].DataType == typeof(double)) + { + dbType = DbType.Double; + } + sbi.AddParameter(table.Columns[i].ColumnName, dbType); + } + for (int x = 0; x diff --git "a/.Net6\347\211\210\346\234\254/VOL.Core/Utilities/SQLiteBulkInsert.cs" "b/.Net6\347\211\210\346\234\254/VOL.Core/Utilities/SQLiteBulkInsert.cs" new file mode 100644 index 00000000..a5bacf4b --- /dev/null +++ "b/.Net6\347\211\210\346\234\254/VOL.Core/Utilities/SQLiteBulkInsert.cs" @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +//using System.Data.SQLite; +using System.Data; +using Microsoft.Data.Sqlite; + +namespace VOL.Core.Utilities +{ + public class SQLiteBulkInsert + { + private SqliteConnection m_dbCon; + private SqliteCommand m_cmd; + private SqliteTransaction m_trans; + + private Dictionary m_parameters =new Dictionary(); + + private uint m_counter = 0; + + private string m_beginInsertText; + + public SQLiteBulkInsert(SqliteConnection dbConnection, string tableName) + { + m_dbCon = dbConnection; + m_tableName = tableName; + + StringBuilder query = new StringBuilder(255); + query.Append("INSERT INTO ["); query.Append(tableName); query.Append("] ("); + m_beginInsertText = query.ToString(); + } + + private bool m_allowBulkInsert = true; + public bool AllowBulkInsert { get { return m_allowBulkInsert; } set { m_allowBulkInsert = value; } } + + public string CommandText + { + get + { + if (m_parameters.Count < 1) + throw new SqliteException("You must add at least one parameter.",-1); + + StringBuilder sb = new StringBuilder(255); + sb.Append(m_beginInsertText); + + foreach (string param in m_parameters.Keys) + { + sb.Append('['); + sb.Append(param); + sb.Append(']'); + sb.Append(", "); + } + sb.Remove(sb.Length - 2, 2); + + sb.Append(") VALUES ("); + + foreach (string param in m_parameters.Keys) + { + sb.Append(m_paramDelim); + sb.Append(param); + sb.Append(", "); + } + sb.Remove(sb.Length - 2, 2); + + sb.Append(")"); + + return sb.ToString(); + } + } + + private uint m_commitMax = 10000; + public uint CommitMax { get { return m_commitMax; } set { m_commitMax = value; } } + + private string m_tableName; + public string TableName { get { return m_tableName; } } + + private string m_paramDelim = ":"; + public string ParamDelimiter { get { return m_paramDelim; } } + + public void AddParameter(string name, DbType dbType) + { + SqliteParameter param = new SqliteParameter(m_paramDelim + name, dbType); + m_parameters.Add(name, param); + } + + public void Flush() + { + try + { + if (m_trans != null) + m_trans.Commit(); + } + catch (Exception ex) { throw new Exception("Could not commit transaction. See InnerException for more details", ex); } + finally + { + if (m_trans != null) + m_trans.Dispose(); + + m_trans = null; + m_counter = 0; + } + } + + public void Insert(object[] paramValues) + { + if (paramValues.Length != m_parameters.Count) + throw new Exception("The values array count must be equal to the count of the number of parameters."); + + m_counter++; + + if (m_counter == 1) + { + if (m_allowBulkInsert) + m_trans = m_dbCon.BeginTransaction(); + + m_cmd = m_dbCon.CreateCommand(); + foreach (SqliteParameter par in m_parameters.Values) + m_cmd.Parameters.Add(par); + + m_cmd.CommandText = this.CommandText; + } + + int i = 0; + foreach (SqliteParameter par in m_parameters.Values) + { + par.Value = paramValues[i]; + i++; + } + + m_cmd.ExecuteNonQuery(); + + if (m_counter == m_commitMax) + { + try + { + if (m_trans != null) + m_trans.Commit(); + } + catch (Exception ex) { } + finally + { + if (m_trans != null) + { + m_trans.Dispose(); + m_trans = null; + } + + m_counter = 0; + } + } + } + } +} diff --git "a/.Net6\347\211\210\346\234\254/VOL.WebApi/appsettings.json" "b/.Net6\347\211\210\346\234\254/VOL.WebApi/appsettings.json" index 5a761a68..545ae936 100644 --- "a/.Net6\347\211\210\346\234\254/VOL.WebApi/appsettings.json" +++ "b/.Net6\347\211\210\346\234\254/VOL.WebApi/appsettings.json" @@ -14,10 +14,11 @@ "AppUrls": { }, "Connection": { - "DBType": "MsSql", //MySql/MsSql/PgSql //数据库类型,如果使用的是sqlserver此处应设置为MsSql + "DBType": "sqlite", //MySql/MsSql/PgSql/sqlite //数据库类型,如果使用的是sqlserver此处应设置为MsSql //sqlserver连接字符串 - "DbConnectionString": "Data Source=JXX2835\\SQLEXPRESS;Initial Catalog=netcoredev;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=500;", - + //"DbConnectionString": "Data Source=JXX2835\\SQLEXPRESS;Initial Catalog=netcoredev;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=500;", + //sqlite + "DbConnectionString": "Data Source=../../DB/sqlite/vol.db", //mysql连接字符串(升级EFCore3.1到时已将mysql连接字符串修改,2019-12-20) // "DbConnectionString": " Data Source=127.0.0.1;Database=netcoredev;AllowLoadLocalInfile=true;User ID=root;Password=123456;allowPublicKeyRetrieval=true;pooling=true;CharSet=utf8;port=3306;sslmode=none;", diff --git a/DB/sqlite/vol.db b/DB/sqlite/vol.db index f8df55e8ca0d888355afd58e95faa52bcf8df1b7..1bcaa011c84bd332111cd71904d24edbf3fc5bc1 100644 GIT binary patch delta 12388 zcmeI2OKcm*8GuQVvYsTZhh@udBSMLRxDA&(yEFTsQzSCg%Cb$xwH|(4k|nv8Rw6}( zq^w6;jHNiPQ8a*pq;-@-+Z0CIQ;ot!4b*K@6uz{_9*bTK_>uJBUfNTDw6ja@id+u4 zq^$N(5Vi%AGoZnq){)j3m&lIJH|KR<$SHIli ze{iQKc+cSrZ$F**&eI9^-KP^Ry&n&^l25t=pOc@iOM%b3{@NMs z5ZaII+irc=`vKgn7Ti(Spv%>9%)QYz^wkcI<+u@maVY2=8Q7w_zGK)%fEj*^? zPvB)Ol~l7k?^+-G^w;k^`OVLs{Nm#$Th|}G_u=MXcdyQ=-Q=`ViHVIM#BfLuIZmt- z6Rwk!BPJWA;!#9al;m2JuqCen&%iXL=JJzornI~|rNmQecvj7yRc6&uC9hb!?R0`& zC0f)@v}kC^)n0ifoTyvX+n;&pQXtTIV1{_(17T=1*O%+WnCYpvMN?% zG4tWN|kvKXCVrK1e8NC zu8JXeijqjihrj(~``%~U*B{^5di32NSwJgYJ0?EA;PLBy2#4Cr%``_- zNl1bVIU)<3JUDJJ(m6haN*86EMUbH=QdAPxigfzJ((QCcvpo|FsNG&W_Ze_%+bcwj zfH){Z6wBbfOamO@xG&f>6i3KuWLaQkj-%kIMaS7--|lZU;#o_S80?#0qZurYAXYzu z1>}FrV+z}W6nJo)Bnwqcw%lUplId5;cd&HJU0Yh6+p*ls$s{L>0t`V#VaboA5W+G* zD3nMhRFzL4PUTr*x*z=f@r}EWw%&bw;|Gs!Uw`uBjn6*V{`B^3OY17lxN$4?7OWVX zk%ex?fYDWh=*Hee+sa^z>&#b)l901VNJ5~_$YKSSnpTYUTp8HSc+gXB##A^QBx#ty zLy?&AuC*3ZvUx`{Za-I{wVXgqNFaY3%;s^pCLS7{jrA5IDJdjs?ML0SefA_3$`K$l zByEP0P#X?z^s3_sXR@44@hIfVMHHgo;f(81G3sISqLa!bl+;`%moH?fxfNx0mU#aw zAYA+}GoQ;WMj~J%<1SGSB7Urj_#Bjpmv^w7y_es0jRt_1fGA7F9K8gI0FW!G zy2{Mu$;J1g@0#aV-sC6fwW$#h)5de-X{24!#)a|uuX7Xgv6YFb1@doPI}<&XQcsR( zuW93}6Z03>W1|g+qxwk?!NB|JP7N3xBS=qN&l$-1;5w# z(0AW=%XiI}^o{zwz8AXhcRwUI`WxMN$P;y!V?ZzhMFz{Dkf7wL6rj{Cw>;;G+6q*K<)YjA=^L%VVIQ%6pL@U+@cVnZ|JAI1 zHLG8=8sSb2rw}{!5=XQ8RlSJXtbR4CUq)gbX;#0Q)vreSJdT&2X7#H^53E`JD(?xp zo7Jyo^{ZL^YOKWHtbY9;RlmlZs$c08srVIc!C$!ifA{^R`(D?dI{(~pr~QX*@9fL9 zp7$b8(EY`op8bDw`aSbrSbqvZlCQ$Z{w(-0K2zXg?>O1JI)Usx(&WQAo z>YDr*I#iha7}4j4s!V>6vse{K3K#qg14NEoyp^h>pM~^eEX{eIRvReqS%s-r-@${1 zN_3dPm@*So6x}GUQbgZ{?@Ul&pxj_6V=)GuVr98r zI>cMlGg;=S7%Mb90_4e9OietrqEX3QOzp9lfdl1^HeKmNN~`HKCV2PLc8*M3|FA(J zhk*=`1=52u$E0w*<96}FY+X2-Rh7Itsb;Te2{mVFm%Vk_+h49O6#q(2!!fwnNuaU$ zFQS<-$>8Epq;VKtAZXYITbJQ-GBGkMld6iPzptP%hJPiYd4Up}dA(^_XrMF_cXk(c zaQR)V^?N3m9WE?Gn%yF(IeBOayiG-i~?7cXZluy!(ieuIpaxNB50R)5!t3~p?~-I2`kN-$&wk+iBIM+GxxdJ0S6 VN)I|lMs)SrZ8E1@=|GDb^B-0CO!fc( delta 189 zcmZoTAlA?zHbI)zg@J(~VxodQqszvGCHBmGeD5Z+JIGE~n!tEwvx34u-sX3H?eF{; zx4-ja5?Z)TfQ3b%m4$gL3roU&3%@MiN`Gh1V$WRD%&1IHGtVqnBcNEhUr1z?Z&rGy zkF!@!s)u8yf2L=JUlvfzC9=vd#M5MY-d+|zlf-`0#lb{W2gM>|M#=7PFT*;z$~zxC4u#iJOHN>K)L_` -- Gitee