当前位置: 首页 > news >正文

c# 实现sql查询DataTable数据集 对接SqlSugar ORM

有时候对于已经查询到的数据集,想要进行二次筛选或者查询,还得再查一遍数据库

或者其他的一些逻辑处理不太方便,就想着为什么不能直接使用sql来查询DataTable呢?

搜索全网没找到可用方案,所以自己实现了一个。

主要实现思路是使用 SQLite In-Memory Database 内存数据库,

需要的包主要是

System.Data.SQLite和 SqlSugar

代码如下

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace SQLiteHelper
{public static class SQLiteHelper{public static SqlSugarClient getToSQLiteInMemorySqlSugar(DataTable dt){SQLiteConnection conn = SQLiteHelper.ToSQLiteInMemory(dt);//创建配置并指定连接字符串var config = new ConnectionConfig(){ConnectionString = conn.ConnectionString,DbType = SqlSugar.DbType.Sqlite};//创建SqlSugarClientvar db = new SqlSugarClient(config);//手动指定底层连接为已有的SQLite连接db.Ado.Connection = conn;return db;}private static string GetSQLiteType(Type t){if (t == typeof(string)) return "TEXT";else if (t == typeof(int)) return "INTEGER";else if (t == typeof(double)) return "REAL";else if (t == typeof(decimal)) return "NUMERIC";else return "BLOB";}private static SQLiteConnection ToSQLiteInMemory(DataTable dt){// 创建SQLite in-memory数据库连接SQLiteConnection conn = new SQLiteConnection("Data Source=:memory:");conn.Open();// 创建表结构SQLiteCommand cmd = conn.CreateCommand();string createTableSql = $"CREATE TABLE {dt.TableName} (";foreach (DataColumn col in dt.Columns){createTableSql += $"{col.ColumnName} {GetSQLiteType(col.DataType)}, ";}createTableSql = createTableSql.TrimEnd(',', ' ');createTableSql += ")";cmd.CommandText = createTableSql;cmd.ExecuteNonQuery();// 将DataTable bulk insert到SQLite表中using (SQLiteTransaction tran = conn.BeginTransaction()){using (SQLiteCommand insertCmd = new SQLiteCommand(conn)){insertCmd.CommandText = $"INSERT INTO {dt.TableName} VALUES({string.Join(",", dt.Columns.Cast<DataColumn>().Select(x => "@" + x.ColumnName))})";foreach (DataRow row in dt.Rows){foreach (DataColumn col in dt.Columns){insertCmd.Parameters.AddWithValue("@" + col.ColumnName, row[col.ColumnName]);}insertCmd.ExecuteNonQuery();insertCmd.Parameters.Clear();}tran.Commit();}}return conn;}}
}

调用示例

			// 创建DataTable,添加列DataTable dt = new DataTable("Products");dt.Columns.Add("Id", typeof(int));dt.Columns.Add("Name", typeof(string));dt.Columns.Add("Price", typeof(decimal));// 添加表到DataSetds.Tables.Add(dt);// 填充几行数据dt.Rows.Add(1, "Apple", 1.99m);dt.Rows.Add(2, "Orange", 2.99m);dt.Rows.Add(3, "Banana", 0.99m);var db = SQLiteHelper.getToSQLiteInMemorySqlSugar(dt);//查询结果var ret = db.Ado.SqlQuery<dynamic>("select * from Products").ToList();

这样就实现了sql查询DataTable的功能

原创不易,能帮到你的话,关注,评论,点赞,收藏走一波。

http://www.lryc.cn/news/134321.html

相关文章:

  • 记一次布尔盲注漏洞的挖掘与分析
  • C++11 新特性 ---- noexcept
  • 《Linux运维总结:Centos7.6之OpenSSH7.4p1升级版本至9.4p1》
  • 七夕节日表白:七大网页风格与其适用人群
  • 通达信指标公式16:使用BARSLAST函数写一个指标回测的思路
  • Jenkins自动化部署Vue项目
  • Android JNI打印logcat日志
  • 第28次CCF计算机软件能力认证(测试)
  • 九耶丨阁瑞钛伦特-Java高频面试题-请谈谈 ReadWriteLock 和 StampedLock
  • 【Linux操作系统】深入探索Linux系统编程中的信号集操作函数
  • [C初阶笔记]P2
  • C++并发编程学习01——hello concurrent world
  • 大数据扫盲(2): 数据分析BI与ETL的紧密关系——ETL是成功BI的先决条件
  • Java web 中的 jsp
  • uniapp 数组操作
  • 数据结构算法--4堆排序
  • C++学习系列之DLL动态库使用
  • Java实现钉钉企业内部应用机器和自定义机器人发送消息
  • 基于QT4的GPX文件编辑器开发
  • 树结构使用实例---实现数组和树结构的转换
  • 论文阅读_条件控制_ControlNet
  • 全链路数据湖开发治理解决方案2.0重磅升级,全面增强数据入湖、调度和治理能力
  • 【算法题】2769. 找出最大的可达成数字
  • 023:vue中解决el-date-picker更改样式不生效问题
  • 爬虫借助代理会让网速快点吗?
  • 探索智能文字识别:技术、应用与发展前景
  • STL——list用法
  • Linux的基础指令
  • 深入浅出Pytorch函数——torch.nn.init.normal_
  • Vue.js知识点学习的一点笔记