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,不过上面这个参数加上也不会报错。

  • 相关阅读:
    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
    便携版WinSCP在命令行下同步文件夹
    ffmpeg (ffprobe)分析文件关键帧时间点
    sqlite删除数据或者表后,回收数据库文件大小
    ubuntu 20.04下 freeswitch 配合 fail2ban 防恶意访问
    ffmpeg使用nvenc编码的结论记录
    PC版跑跑卡丁车 故事模式 亚瑟传说章节 卡美洛庆典 2阶段 心灵之眼 攻略
    There was an error loading or playing the video
    Nvidia RTX Voice 启动报错修复方法
    火狐浏览器 关闭跨域限制
  • 原文地址:https://www.cnblogs.com/joeymary/p/4658630.html
Copyright © 2011-2022 走看看