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

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

這段程式主要是利用 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. 【爆料】-《卧龙岗大学毕业证书》UOW一模一样原件

    ☞西悉尼大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&a ...

  2. 对于zuul服务网关框架资料整理

    本次博客只是整理了一些 看过的博客.源码等 zuul入门(1)zuul 的概念和原理 https://www.cnblogs.com/lexiaofei/p/7080257.html 深入理解Zuul ...

  3. 轻量化卷积神经网络MobileNet论文详解(V1&V2)

    本文是 Google 团队在 MobileNet 基础上提出的 MobileNetV2,其同样是一个轻量化卷积神经网络.目标主要是在提升现有算法的精度的同时也提升速度,以便加速深度网络在移动端的应用.

  4. unison+inotify的Web目录同步方案

    1.在Linux下做WEB目录文件同步 一般有如下几种方式: ----------------------------------------------- 1)       nfs实现web数据共享 ...

  5. gin框架使用注意事项

    gin框架使用注意事项 本文就说下这段时间我在使用gin框架过程中遇到的问题和要注意的事情. 错误处理请求返回要使用c.Abort,不要只是return 当在controller中进行错误处理的时候, ...

  6. java并发编程(2) --Synchronized与Volatile区别

    Synchronized 在多线程并发中synchronized一直是元老级别的角色.利用synchronized来实现同步具体有一下三种表现形式: 对于普通的同步方法,锁是当前实例对象. 对于静态同 ...

  7. Python与家国天下

    导读:Python猫是一只喵星来客,它爱地球的一切,特别爱优雅而无所不能的 Python.我是它的人类朋友豌豆花下猫,被授权润色与发表它的文章.如果你是第一次看到这个系列文章,那我强烈建议,请先看看它 ...

  8. 用markdown + html写一封简历

    0. 前言 1. 阶段1 - 确定需要几个模块 2. 阶段2 - 使用纯文字填充简历 3. 阶段3 - 预留空格 4. 阶段4 - 文章垂直方向的调整 5. 阶段5 - 居中对齐 6. 阶段6 - 加 ...

  9. Yii2设计模式——工厂方法模式

    应用举例 yii\db\Schema抽象类中: //获取数据表元数据 public function getTableSchema($name, $refresh = false) { if (arr ...

  10. git 的常用命令

    1. 添加远程仓库地址 git remote add origin xxxxxxxxxxxx 2.初始化仓库 git init 3.创建分支 git checkout -b xxxxxx 4. 查看当 ...