最近有次在修改某段程式時,發現一段程式算法看起來簡單。

但背後因為多次查詢數據庫,導致效能問題。

這段程式主要是利用 EPPLUS 讀取 Excel 資料,檢查資料是否已存在數據庫中,若有就將已存在的序號回傳

優化前的案例原碼如下

 //預先檢查是否有存在的編號
string duplicateNumber = "";
for (int row = startRow; row <= worksheet.Dimension.End.Row; row++)
{
if (worksheet.Cells[row, ].Value != null)
{
var result = Conn.QueryFirst<int>(@"
SELECT 1 FROM TemplateNumber
WHERE SerialNumber = @SerialNumber ",
new
{
SerialNumber = worksheet.Cells[row, ].Value,
});
if (result == )
{
duplicateNumber += worksheet.Cells[row, ].Value;
}
}
}

從上述可以看到,對於每一行Row的資料,都進一次庫去做查詢比對

那在這種情況要怎麼修改呢? 其實仔細想一下查詢語句的轉換就行了

List<string> querySerialNum = new List<string>();

                for (int row = startRow; row <= worksheet.Dimension.End.Row; row++)
{
if (worksheet.Cells[row, ].Value != null)
{
querySerialNum.Add(worksheet.Cells[row, ].Value.ToString());
}
}
var result = Conn.Query<string>(@"
SELECT SerialNumber FROM TemplateNumber
WHERE SerialNumber IN @SerialNumber ",
new
{
SerialNumber = querySerialNum
});
if (result.Any())
{
throw Exception(string.Join(";",result));
}

可以看到這次我把 Excel 的內容先放到一個陣例裡,最後改用 IN 的方式去將已存在的資料取出

這樣原本 N 次的庫查詢動作,現在只需要 1 次庫的查詢即可

看完後是不是感覺很簡單? 各位可以查看一下同事們寫的代碼裡,是否也有出現這樣的問題唷

咱們下次見!

一次 C# 查詢數據庫 算法優化的案例的更多相关文章

  1. C#根據當前DataGridView查詢數據導出Excel

    private void btnsuggestinfo_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.C ...

  2. SQL查詢數據字典

    SELECT d.name AS 表名 , f.value AS 表说明, 字段序号 = a.colorder , 字段名 = a.name , 标识 THEN '√' ELSE '' END , 主 ...

  3. 數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)

    ORACLE數據庫轉MySQL數據庫遇到的坑 總結 最近在做Oracle轉mysql的工程,遇到的坑是真的多,尤其是存儲過程,以前都沒接觸過類似的知識,最近也差不多轉完了就總結一下.希望能幫到一些人( ...

  4. python連接mysql數據庫

    第一步,安裝mysql數據庫. 這裏我安裝的是mariadb數據庫,版本5.5,並且配置好了字符集.此處不詳細敘述,相信大家沒有問題. 第二步,安裝mysql驅動. 首先說明一下有兩個主要的驅動: m ...

  5. PB C/S轉B/S ODBC方式連接數據庫

    PB C/S轉B/S ODBC方式連接數據庫,DSN需要建為系統而不是使用者DSN,否則連不上數據庫.

  6. 使用DataSet與DataAdapter對數據庫進行操作

    1.定義連接字符串 var source = "server=(local); integrated security=SSPI; database=test"; var conn ...

  7. C#數據庫

    一.連接數據庫 1.定義連接數據庫的字符串 string source = "server=(local); integrated security=SSPI; database=test& ...

  8. 在Android中afinal框架下實現sqlite數據庫版本升級的辦法

    public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫.   pub ...

  9. MVC+Ninject+三层架构+代码生成 -- 总结(一、數據庫)

    一.數據表 是參照 別人的庫建表的 ,主鍵都是用int 自增,若是跨數據庫的話,建議使用GUID為主鍵.

随机推荐

  1. nginx+php安装

    1.环境概述 虚拟机系统:CentOS Linux release 7.3.1611 (Core) 宿主机系统:Mac Sierra version 10.12.3 nginx:1.10.3 php: ...

  2. java 四舍五入保留两位小数

    // 保留两位小数 System.out.println(Double.parseDouble(String.format("%.2f", 55.5454545454))); // ...

  3. 大数据技术之_19_Spark学习_02_Spark Core 应用解析小结

    1.RDD 全称 弹性分布式数据集 Resilient Distributed Dataset它就是一个 class. abstract class RDD[T: ClassTag](    @tra ...

  4. 从壹开始前后端分离[.NetCore ] 38 ║自动初始化数据库(不定期更新)

    缘起 哈喽大家好呀,我们又见面啦,这里先祝大家圣诞节快乐哟,昨天的红包不知道有没有小伙伴抢到呢.今天的这篇内容灰常简单,只是对我们的系统的数据库进行CodeFirst,然后就是数据处理,因为这几个月来 ...

  5. Java 运算符 % 和 /

    / 是除运算符, %是取模运算符 区别: / 是普通的除法运算,如果除数和被除数都是整数,则商是取整 %是求余数 private static void test() { System. / ); S ...

  6. 基于tcp实现远程执行命令

    命令执行服务器: # Author : Kelvin # Date : 2019/1/30 20:10 from socket import * import subprocess ip_conf = ...

  7. Python中os和sys模块中常用的方法

    os模块 os模块:该模块提供了一些方便使用操作系统相关功能的函数 os.remove() 删除文件 os.rename() 重命名文件 os.walk() 文件目录遍历器 os.chdir() 改变 ...

  8. 『OGG 01』Win7 配置 Oracle GoldenGate 踩坑指南

    安装 Oracle 安装 Oracle11g 32位[Oracle 32位的话,OGG 也必须是 32位,否则会有0xc000007b无法正常启动 错误] 安装目录为 D:\oracle\produc ...

  9. SpringBoot自动配置原理

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...

  10. Java开发环境Jave EE 和 jdk 下载

    以下软件均为64位环境 jdk版本:jdk1.8.0_181 jave EE版本(当前最新版本4.8):eclipse-jee-photon-R-win32-x86_64.zip 链接:https:/ ...