什么样往mysql中程导弹数据实施效能高

本条警示在常规场景中没什么影响,但若是是用excel跑SQL,它会因为该警告阻止你的一而再操作~事实上excel执行sql限制多多,需求更多的奇技淫巧,在此以前小编就写过一篇。言归正传,要化解这一个警示,一种自然是在说话中用到聚合函数的地点统统加上isnull,但假诺语句相当长,地点重重就蛋疼了,于是自身推荐另1个更优雅的做法:

自己将sql语句制作成叁个sql文件,以文件的措施执行,果然,十几分钟就执行完成。

1.宏顺序语句:运转后可以成功三个效用

Sub test()  开始语句

  Range("a1") = 100

End Sub   结束语句

计算 尽管不得不用一个设计情势

自笔者做过大量政北京工人篮球馆系,电信的也好,金融也好,网络项目,照旧创业小项目,也写过不少工具,能明白的例如有Beetl,BeetlSQL,XLSUnit。这么多工程项目,即使让自个儿说最根本的筹划技术是如何,也许只可以用三个统一筹划技术,小编会不暇思索的说,是”职责形式“

职务模式描述了怎么着发现和分叉对象任务,就好比3个班,应该有班长,各科学委,小总裁.
再譬如,音讯里平日出现某某重庆大学事故,就会确立了某某专项委员会。在比如,为了保障项目品质,大家有测试组,为了监察和控制项目,大家有PMO。我们周围生活,平素都依据人尽其职,任务分开那个规格来运营。
假若划分错了,十二分影响大家的生存,比如让自家去监察和控制项目进程:(。

职务格局,能够搜索
GRASP

那是三个很少被人提起的情势,笔者个人推举去学习体会。

卢正雨在《绝世高手》里,从屌丝最后变成了比肩,尽管您看了那么些电影,就驾驭,他变成食神是因为对食物的细致感知。笔者想在《自下向上的编辑撰写不难阅读的代码方法》这一有的的下结论是
”感知对象的留存“,你也能写出不难阅读的代码,甚至成为权威。

– EOF –

最开头没考虑推行功效,笔者转载为sql语句后,用navicat作为数据库查看的界面,然后新建查询,将组织好的sql语句粘到里面,执行,然后sql语句起头疯跑,3万多条记下,执行了八百多秒,十六分钟啊,太慢了,当时没留神。后来,发现导入的多寡某些地点因为excel格式而发出难题,于是又再次布局,再往数据库中程导弹。又是久久的等候。。。

一、VBA对象:

VBA中的对象实际就是大家操作的有所艺术、属性的excel中帮助的对象
Excel中的多少个常用对象表示方法

我在
有关极简编制程序的合计
中曾提到要编写制定可观望的代码。因为代码是编辑壹回,阅读数次。
阅读者包涵代码编写者,以及后来的护卫人士。能让阅读代码更自在,有利于抓好项目依旧产品的可维护性。

只需语句顶部加一句:

敲定:以文件格局进行sql语句比新建查询语句执行sql语句作用高得多。

VBA学习笔记01(链接)
VBA学习笔记02 (链接)

本博客分为前后俩有的,第叁有的上书在代码层次
编写可观察的代码,参考地址是https://my.oschina.net/xiandafu/blog/1509679

搞掂。

题材,给您1个Excel数据文件,要求往mysql的数据库中程导弹入数据。

叁 、用VBA在单元格中输入数组公式

Sub t4()
  Range("c9").FormulaArray = "=SUM(B2:B6*C2:C6)"
End Sub

察觉目的

在上半部分,大家讲到三个解析excel的例证,在笔者骨子里项目里,曾经是这一个样子

public void parse(Sheet sheet,StringBuilder error){

User user = readUserInfo(sheet,error);
List<Order> orders = readUserOrderInfo(sheet,error);
UserCredit credit = readUserCreditInfo(sheet,error);

}

故而提供1个StringBuilder
参数,是因为须求是要是条分缕析出错,须要出示出错的的地方,项目开发人士因而将错误音讯拼接成字符串,末了回来给前端。

要是审查其完结,你会发现该解析方法四处都是类似如下代码

error.append("在"+line+"和”+col+“列错":+"messsage).append("\n");

这两段代码的阅读者狐疑之处正是error定义无法评释什么处精晓析错误,阅读者不得不看领悟具体完毕才醒悟–原来自身的前任用StringBuilder是想这么干。其它1个猜忌之处就是在解析excel的时候,就早已写死了错误输出的样板,假若想更改,就须求改每一处地方
,咱们通晓事情的excel解析,几百行代码算是少的了。要阅读者几百行代码重构对后来者并非易事。

有啥样格局大概设计标准能消除那么些呢?

自家想说的是,并不曾情势和布署性标准能缓解,开发者贫乏的唯有是发现和归咎对象的能力(设计方式是锦上添花),对于excel解析的错误新闻,实际上就相应定义多少个”错误新闻“那样的靶子。比如

public class ExcelParseError{
    public void addError(ParseErrorInfo info ){}
    public void addSimpleError(String line,String col,String message ){}
    public List<ParseErrorInfo> getMessages(){}
    public String toString(){
        .....
    }
}

之所以,excel解析最终是以此样子

public void parse(Sheet sheet,ExcelParseError error){
User user = readUserInfo(sheet,error);
List<Order> orders = readUserOrderInfo(sheet,error);
UserCredit credit = readUserCreditInfo(sheet,error);

}

处精晓析错误的代码则改为如下

error.addSimpleError(line,col,message);
SET ANSI_WARNINGS OFF;

第贰,你得根据对应表字段对excel数据文件进行布局,然后转向为insert的sql语句,然后往数据库中插入。

CH5 文件操作

<br />


<br />

重复发现指标

发现目的是让杂乱代码变得平稳的最器重情势,看如下例子:

public Long  startWorkflow(String user,long orgId,long taskType,long workflowType,Map<String,String> taskParas){
    .....
}

那是1个干活流引擎运营流程的API,共有四个参数。那是本身已经项指标最早定义的API,后来实在又壮大了一些个参数,比如工作流补助版本后,又供给扩大3个参数是int
workflowVersion。

那四个参数实际上意味着了开发银行工作流供给的三类参数,”工作流参加人的叙说”,”工作流本身的叙说”,还有”工作流运营的输入参数”,由此,那几个API最后定义成

public Long  startWorkflow(Participant p,WorkflowDef workflow,Variable vars){
    .....
}

Participant对应了工作流参预人描述
WorkflowDef 对应了工作流定义
Variable 则对应了工作流参数

那些指标提升了API的可扩大性,更为主要的是,他的代码特别便于阅读,无论是调用者,还是api本身的贯彻,”新意识的靶子”让一无可取的变量变得平稳起来.

目的是在我们编程生活中实际存在的,借使能感知到目的存在,则编制程序会美好很多,同样,阅读和爱惜代码也会进一步有益。在未曾感知对象的场馆下妄谈设计情势和和规划规范,正是无源之水。

下贰个例证是本人的BeetlSQL的事例,有二个SQLLoader类用来加载sql语句,在那之中有一个有的是
从markdown
文件加载sql语句。最初代码如下(警告,代码有剧毒,不要阅读,直接跳过)

bf = new BufferedReader(new InputStreamReader(ins));
String temp = null;
StringBuffer sql = null;
String key = null;
while ((temp = bf.readLine()) != null) {
    if (temp.startsWith("===")) {// 读取到===号,说明上一行是key,下面是SQL语句
        if (!list.isEmpty() && list.size() > 1) {// 如果链表里面有多个,说明是上一句的sql+下一句的key
            String tempKey = list.pollLast();// 取出下一句sql的key先存着
            sql = new StringBuffer();
            key = list.pollFirst();
            while (!list.isEmpty()) {// 拼装成一句sql
                sql.append(list.pollFirst() + lineSeparator);
            }
            this.sqlSourceMap.put(modelName + key, new SQLSource(
                    sql.toString()));// 放入map
            list.addLast(tempKey);// 把下一句的key又放进来
        }
    } else {
        list.addLast(temp);
    }
}
// 最后一句sql
sql = new StringBuffer();
key = list.pollFirst();
while (!list.isEmpty()) {
    sql.append(list.pollFirst());
}
this.sqlSourceMap.put(modelName + key,
        new SQLSource(sql.toString()));

那段代码解析markdown文件,读取以===分割的的sql片段,并放置sqlSourceMap里。大致格式如下

    disableUser
    ===
    * 这是一个更新用户信息的SQL语句
    update user set status = 1 where id = #id#

就算解析代码不算长,且有很多评释,但每回在那里扩展一些增添都无比不方便。比如马克down
协理 ”*“ 符号作为注释语句,那对”*”代码解析放在个哪个地点?

后来笔者对那段代码实行重构了,实际上,作者是发现本身索要二个MDParser类来承担那事情
:专门解析md文件,MDParser定义如下(能够阅读了)

public class MDParser {
    public MDParser(String modelName,BufferedReader br) throws IOException{
        this.modelName =  modelName;
        this.br = br;
        skipHeader();
    }
    public void skipHeader() throws IOException{
    ....
    }

    public SQLSource next() throws IOException{
        String sqlId = readSqlId();
        if(status==END){
            return null;
        }
        //去掉可能的尾部空格
        sqlId = sqlId.trim();
        skipComment();
        if(status==END){
            return null;
        }
        int sqlLine = this.linNumber;
        String sql = readSql();

        SQLSource source = new SQLSource(modelName + sqlId,sql);
        source.setLine(sqlLine);
        return source;
    }
}

从这么些类能够看出,当读入叁个markdown文件的时候,首选调用skipHeader,去掉md文件起先非亲非故的文书档案全部表明

next方法用来获得每二个sql片段表达,先调用
readSqlId获取sql的标记符号,然后 skipComment方法用来忽略sql注释,最终readSql用来读取sql语句内容。

MDParser 使得SQLLoader越发精简和简单阅读,也使得关于马克kdown
解析尤其简单保证。

何今后mysql中程导弹数据实施功用高

贰 、 EXCEL文件操作

1 判断A.Xls文件是不是留存

Sub W1()
 If Len(Dir("d:/A.xls")) = 0 Then
   MsgBox "A文件不存在"
 Else
   MsgBox "A文件存在"
 End If
 End Sub

2 判断A.Xls文件是或不是打开

Sub W2()
 Dim X As Integer
  For X = 1 To Windows.Count
    If Windows(X).Caption = "A.XLS" Then
      MsgBox "A文件打开了"
      Exit Sub
    End If
  Next
End Sub

3 excel文本新建和保留

Sub W3()
 Dim wb As Workbook
 Set wb = Workbooks.Add
   wb.Sheets("sheet1").Range("a1") = "abcd"
 wb.SaveAs "D:/B.xls"
End Sub

4 excel文件打开和关闭

 Sub w4()
        Dim wb As Workbook
              Set wb = Workbooks.Open("D:/B.xls")
              MsgBox wb.Sheets("sheet1").Range("a1").Value
        wb.Close False
 End Sub

5 excel文件保留和备份

 Sub w5()
      Dim wb As Workbook
       Set wb = ThisWorkbook
        wb.Save
        wb.SaveCopyAs "D:/ABC.xls"
 End Sub

6 excel文本复制和删除

 Sub W6()
  FileCopy "D:/ABC.XLS", "E:/ABCd.XLS"
  Kill "D:/ABC.XLS"
 End Sub

7.断定A工作表文件是还是不是留存

Sub s1()
 Dim X As Integer
  For X = 1 To Sheets.Count
    If Sheets(X).Name = "A" Then
      MsgBox "A工作表存在"
      Exit Sub
    End If
  Next
  MsgBox "A工作表不存在"
End Sub
  1. excel工作表的插入

     Sub s2()
        Dim sh As Worksheet
        Set sh = Sheets.Add
        sh.Name = "模板"
        sh.Range("a1") = 100
     End Sub
    

9.excel工作表隐藏和撤消隐藏

 Sub s3()
          Sheets(2).Visible = True
 End Sub

10.excel工作表的活动

 Sub s4()
             Sheets("Sheet2").Move before:=Sheets("sheet1")        ‘sheet2移动到sheet1前面
            Sheets("Sheet1").Move after:=Sheets(Sheets.Count)      ’ sheet1移动到所有工作表的最后面
 End Sub

11.excel工作表的复制

 Sub s5() 在本工作簿中
      Dim sh As Worksheet
        Sheets("模板").Copy before:=Sheets(1)
        Set sh = ActiveSheet
        sh.Name = "1日"
        sh.Range("a1") = "测试"
 End Sub

Sub s6() 另存为新工作簿

  Dim wb As Workbook
   Sheets("模板").Copy
   Set wb = ActiveWorkbook
      wb.SaveAs ThisWorkbook.Path & "/1日.xls"
      wb.Sheets(1).Range("b1") = "测试"
      wb.Close True
   End Sub

12.维护理工科人作表

 Sub s7()
        Sheets("sheet2").Protect "123"
 End Sub
 Sub s8() 判断工作表是否添加了保护密码
  If Sheets("sheet2").ProtectContents = True Then
    MsgBox "工作簿保护了"
  Else
    MsgBox "工作簿没有添加保护"
  End If
 End Sub

13.工作表删除

 Sub s9()
   Application.DisplayAlerts = False
     Sheets("模板").Delete
   Application.DisplayAlerts = True
 End Sub

14.工作表的取舍

 Sub s10()
   Sheets("sheet2").Select
 End Sub

这一局地上书方法,类,以及部分企划上的考虑,这一个考虑并不是来源于于有个别设计基准依然是设计格局,而是基于对象的职分,将在底下会讲述

 

CH3 VBE编辑器

  • 1.诠释文字 :文字前加单引号
  • 2.勒迫转行 空格+下划线
  • 3.调节工具栏: 逐语句运营或按F8
  • 4.安装断点:STOP
  • 5.及时窗口: debug.print “第“&X&”运转结果“ 呈现某步程序运营结果
  • 6.当地窗口:呈现运营中断时对象消息
    <br />

<br />

警惕String,数组,和 Map

当程序中冒出String
参数,数组参数,以及Map的时候,已经在提拔我们是漏掉了系统的靶子。
那四个连串参数当然非凡灵活,能包容下别的数据结构,但有或许遗漏了系统包罗的目的。尤其是数组和Map。作者在上一章提到过的事例

Object[] rets = call();
boolean  success = (Boolean)rets[0];
String msg = (String)rets[1];

就从不上面包车型地铁定义好

CallResult rets = call();
boolean  success = rets.isSuccess();
String msg =  rets.getMessage();

一经CallResult包蕴了有个别重回值,那么,将CallResult定义成泛型就特别简单阅读,比如重返CallResult

public CallResult  getUser(){

}

这一定没有如下代码更便于阅读,让后来者放心去选取

public CallResult<User>  getUser(){

}

澳门新萄京,这一篇笔者提到的每一个好的例证都相对于差的的例证,都会多写数行代码,甚至还得写叁个类
,但一定,阅读特别不难,维护尤其惠及了。

于是乎从头思索:将一张表导出为sql语句再实施、将总体数据库导出再实践好像并从未如此慢啊!

③ 、分支语句

1.Goto语句,跳转到钦定的地点

 Sub t1()
      Dim x As Integer
      Dim sr
      100:
            sr = Application.InputBox("请输入数字", "输入提示")
     If Len(sr) = 0 Or Len(sr) = 5 Then GoTo 100
  End Sub

2.gosub..return ,跳过去,再跳回来

Sub t2()
      Dim x As Integer
      For x = 1 To 10
             If Cells(x, 1) Mod 2 = 0 Then GoSub 100
      Next x
 Exit Sub
 100:
         Cells(x, 1) = "偶数"
     Return
End Sub

3.on error resume next 赶上错误,跳过继续执行下一句

 Sub t3()
  On Error Resume Next
  Dim x As Integer
    For x = 1 To 10
      Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
  Next x
 End Sub

4.on error goto 弄错时跳到钦赐的行数

Sub t4()
    On Error GoTo 100
    Dim x As Integer
    For x = 1 To 10
        Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
    Next x
 Exit Sub
 100:
         MsgBox "在第" & x & "行出错了"
End Sub

5.on error goto 0 撤除错误跳转

    Sub t5()
            On Error Resume Next
            Dim x As Integer
            For x = 1 To 10
            If x > 5 Then On Error GoTo 0
                Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
          Next x
     Exit Sub

<br />


<br />

难点,给您二个Excel数据文件,必要往mysql的数据库中程导弹入数据。
首先,你得坚守对应表字段对excel数据文件…

5、编写自定义函数

  Function wn()
     wn = Application.Caller.Parent.Name
  End Function

<br />


<br />

② 、用VBA在单元格输入带引号的公式

 Sub t3()

       Range("c16") = "=SUMIF(A2:A6,""b"",B2:B6)" 遇到单引号就把单引号加倍

 End Sub

二 、利用单元格公式再次回到值

 Sub t5()
     Range("d16") = Evaluate("=SUMIF(A2:A6,""b"",B2:B6)")
     Range("d9") = Evaluate("=SUM(B2:B6*C2:C6)")
 End Sub

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图