zoukankan      html  css  js  c++  java
  • (ADO.NET小知识点汇总)看到什么记什么

    1、数据库连接池:在同时连接数不多的情况下,

    打开一个链接往数据库导1W条数据的耗时

    导一条数据就打开跟关闭数据库连接的耗时

    两者其实相差不大,这是为什么呢?打开关闭的本身不是有很多耗时吗?这是因为数据库连接池的存在

    当你同时连接数打开的不多的情况下,你关闭一个链接,实际上,这个链接并没有关闭,而是被.Net偷偷藏起来,当然这个藏起来的链接数数量

    是有限定的,所以当你导一条,打开关闭一个链接这种方式导数据时,其实并未真正在“打开关闭连接”。

    2、批量数据提交:SqlBulkCopy类   以读取号码归属地这样一个文本为例 

    首先是把数据读取进来,放到一个本地大集合DataTable中,然后再把这个table扔到数据库中

    DataTable table = new DataTable();

    table.Columns.Add("TelNum");//自己定义的table里面的列名,任意取

    table.Columns.Add("City");

    table.Columns.Add("TelType");

    for(int i = 0;i < lines.Length; i ++)//lines是已经从打开的文本中读取到的集合,一行为单位

    {

      //获取需要往数据库填的字符串

      string line = lines[i];

      string[] strs = line.Split('/t');//VS里'/t'为制表符 以制表符来分割

      string telNum = strs[0];

      string city = strs[1].Trim('"');//去掉两边的双引号 :"北京市"

      string telType = strs[2].Trim('"');

      //然后把数据填充到DataTable中,不过这里需要用到DataRow对象

      DataRow row = table.NewRow();

      row["TelNum"] = telNum ;//一定要在一开始创建table.Columns添加列 

      row["City"] = city ;

      row["TelType"] = telType ;

      //然后把Row跟Table关联起来 

      table.Rows.Add(row);

    }

    //以上操作已经把从文本读到的数据填充到了DataTable中,接下来该把表扔到数据库里了

    using(SqlBulkCopy bulk = new SqlBulkCopy(ConnStr))

    {

      bulk.DestinationTableName = "T_TelNum";//数据库中存数据的表名

      //第一个参数是DataTable中自己定义的列名,第二个参数是数据库表中定义的列名,

      //两个表的列关联起来 (映射!)

      bulk.ColumnMappings.Add("TelNum","TelNum");

      bulk.ColumnMappings.Add("City","TelArea");

      bulk.ColumnMappings.Add("TelType","TelType");

      bulk.WriteToServer(table);//前期工作做完,把DataTable扔到数据库中。

    }

    不用这个类,20分钟。用这个类9秒钟~~~~~~~醉醉哒 

    个人理解:先把数据填到本地数据集DataTable,这样都在本地进行,只是读取字符串,然后一次性的把数据扔到数据库。

    而直接把数据一条条读到数据库中,其中涉及的内部操作,代码量显然是巨大的。

    两者的数据量相同,所以我认为,时间相差这么多,是花在与数据库相互中产生的大量代码量。(也不知道这么说合不合适,给自己看的- -)

    3、数据库中查询为属性为Null的数据。

      select * from T_table1 where Name = Null 这样结果是什么都没有,这样是不行的,Null表示不知道,所以不能说两个“不知道” 可以用 = 相连

      应用:

      select * from T_table1 where Name is Null 

      所以在ADO.NET中如何在有数据要求为Null时插入数据,文本框(textbox)未填值时,默认为"",而不是null,直接给文本框赋值为null也不行,ADO.NET  会报错,所以这里 用到一个类:DBNull。DBNull.Value用来表示数据库中的Null

      有一点要注意,由于DBNull.Value的类型是一个类,所以不能直接转换成字符串,可以将其赋值给Object对象。

    4、Model,当一个方法中可能要用到很多参数,可以考虑给这些参数建一个Model,即一个类,里面全是属性,然后要用到这些参数的时候,直接把这个类当做   参数传入,在方法里面再给这些属性赋值,从而调用。

      注意:对于不可空(null)类型,如果数据库定义可空或者有可能为null时,属性定义的时候要加上? 如 int? Age{get; set;}

    5、三层架构,(只学到把数据访问层分离开来)

      之前都是直接在界面(UI)中写SQL,对于大的项目这样做很难维护,而且复用性不强。三层架构是企业开发中常用的设计模式,把数据库访问、业务逻辑、界面分离。

      业务逻辑层(BLL)  有关逻辑判断语句。

      数据访问层DAL (Data Access Layer)     封装方法,有关数据库的所有语句封装在这里面。包括对SQLHelper 的调用

      界面(UI)

      原则:UI中不出现SQL 

      编写Model(注意可空字段要考虑?(可null)的问题)数据库中定义的可空值

      DAL常用封装:ToModel、ListAll(对于大数据量的数据不要提供,而是提供条件搜索)、

      GetById、DeleteById、Update、AddNew

    6、

    string sqlstr = @"update T_management set number = @number,Admin = @Admin,Password = @Password where number = @number";
    SQLiteHelper.ExecuteNonQuery(sqlstr, new SQLiteParameter("@number", SQLiteHelper.IsNull(m.number, "number")),
    new SQLiteParameter("@Admin", SQLiteHelper.IsNull(m.Admin, "Admin")),
    new SQLiteParameter("@Password", SQLiteHelper.IsNull(m.Password, "Password")));
    //new SQLiteParameter("@number", SQLiteHelper.IsNull(m.number, "number"))
    //@number有两个,不过只加一个参数即OK,不过上面这个参数加上也不会报错。

  • 相关阅读:
    爬虫之JSON
    爬虫bs4案例
    爬虫bs4
    爬虫之Xpath案例
    爬虫之xpath
    监控 Kubernetes 集群应用
    手动部署k8s-prometheus
    ingress之tls和path使用
    ingress安装配置
    kube-dns和coreDNS的使用
  • 原文地址:https://www.cnblogs.com/joeymary/p/4658630.html
Copyright © 2011-2022 走看看