马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
提示:某上市公司AI岗实习过程中的一点学习心得(实习不断,更新不断!)
前言
某上市公司AI岗菜鸟实习过程中的一点学习记载,本篇记载实际业务实现过程中与 SQL Server数据库访问 相干的一些心得。本人主要使用C#语言,其它语言均可参考。
记载日期:2025.01.27
1. 数据入库流程
1.1 获取数据库链接
- string server: 服务器IP(SQL Server中的服务器IP地点)
- string database:数据库库名
- string connStr = ConnectionStringUtil.Get(server, database, out errMsg);
复制代码 1.2 构建并关联数据库实体类、本地映射类
- 除注1外,别的部门可为固定写法。
- 自定义实体类Entities,继承DbContext数据库上下文类。
- OnModelCreating 方法是 DbContext 中的一个重要方法,用于配置实体和数据库之间的映射。
- modelBuilder.Conventions.Remove<…>:这行代码移除了默认的命名约定。EF 默认会使用复数形式来命名数据库中的表,比方,假如你的实体类名是 table_A,EF 会尝试将数据库表命名为 table_As。
- System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention 是 EF 中的一个默认约定,它会将表名转为复数形式。通过移除它,表名将使用实体类名的单数形式,即 table_A 表,而不是 table_As。
- 构建本地实体类table_A,对应数据库中的table_A表。此中的各字段名、字段属性严格遵循table_A表布局。但是当表中存在有默认值的字段时,此字段在本地实体类中可以忽略不写,如ENTRYDATE、ENTRYTIME字段。
- 本地实体类名table_A一样平常设为与实际表名相同,若差别,则必要恰当修改代码(见下)。
- 注1:当仅对表举行查询操作时,此行可省略;当必要修改表,即增、删、改时,必须加上此行。
- public class Entities : DbContext
- {
- public Entities(string conn)
- : base(conn)
- {
- System.Data.Entity.Database.SetInitializer<Entities>(null);
- }
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
- }
- public DbSet<table_A> table_A { get; set; }//注1
- }
- public partial class table_A
- {
- public int ID { get; set; }
- public Nullable<System.DateTime> TDATE { get; set; }
- public string SYMBOL { get; set; }
- public Nullable<double> Rate { get; set; }
- //public Nullable<System.DateTime> ENTRYDATE { get; set; }
- //public string ENTRYTIME { get; set; }
- }
复制代码
- 当本地实体类名midTable_A与实际表名table_A差别时,加入[Table(“table_A”)]举行映射,此中"table_A"是实际数据库表名:
- public class Entities : DbContext
- {
- public Entities(string conn)
- : base(conn)
- {
- System.Data.Entity.Database.SetInitializer<Entities>(null);
- }
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
- }
- public DbSet<midTable_A> midTable_A { get; set; }//注1
- }
- [Table("table_A")]
- public partial class midTable_A
- {
- public int ID { get; set; }
- public Nullable<System.DateTime> TDATE { get; set; }
- public string SYMBOL { get; set; }
- public Nullable<double> Rate { get; set; }
- //public Nullable<System.DateTime> ENTRYDATE { get; set; }
- //public string ENTRYTIME { get; set; }
- }
复制代码 1.3 查询
- 此部门可为固定写法。
- 将查询结果类型转为本地映射类列表,此中每一项代表一个table_A类型的对象,即表中的一条记载。
- using 语句确保 entity 对象在使用完成后被正确开释(即调用 Dispose 方法开释资源)。
- public List<table_A> GetDataList(string sql, string connStr)
- {
- using (Entities db = new Entities(connStr))
- {
- //sql = @"select * from table_A with (nolock) where SYMBOL = 'AAA'";
- return db.Database.SqlQuery<table_A>(sql).ToList();
- }
- }
复制代码 1.4 构建本地映射类对象
- table_A Model = new table_A();
- Model.TDATE = date;
- Model.SYMBOL = "AAA";
- //...
复制代码
- table_A Model = new table_A()
- {
- TDATE = date,
- SYMBOL = "AAA"
- //...
- };
复制代码
- 一样平常来说,ID字段是体系自带,不用显示赋值;数据库建表时有默认值的字段也不用显示赋值。
1.5 数据入库
- 此部门可为固定写法。
- .Add(model)将 model 对象添加到上下文的 table_A 表中。
- Add 方法只是将对象标志为“待插入”,实际插入是在调用 SaveChanges 时完成。
- entity.SaveChanges() 将上下文中挂起的全部更改(如插入、更新、删除等)应用到数据库。
- public void AddDatabaseTable(table_A model, string connStr)
- {
- using (Entities db = new Entities(connStr))
- {
- db.table_A.Add(model);//此处的table_A即数据库实体类中定义的DBSet对象,即public DbSet<table_A> table_A { get; set; }。
- db.SaveChanges();
- }
- }
复制代码 1.6 数据更新
- public void UpdateTable(table_A model, string connStr)
- {
- using (Entities db = new Entities(connStr))
- {
- db.table_A.First(item => item.ID == model.ID).SYMBOL = model.SYMBOL;//此处的table_A即数据库实体类中定义的DBSet对象,即public DbSet<table_A> table_A { get; set; }。
- db.SaveChanges();
- }
- }
复制代码 2. sql查询踩坑
- 查询前先判断sql语句中字段值是否非空,若空则报错:
- if (string.IsNullOrEmpty(Name))
- {
- continue;
- }
- string sql = $"select * from table_A with(nolock) where ID='{Id}' and name='{Name}'";
- return db.Database.SqlQuery<table_A>(sql).ToList();
复制代码
- 当sql语句的字段值中出现单引号时,必要预先更换为两个单引号:(困扰我很久)
- string Name = Name.Replace("'","''");
- string sql = $"select * from table_A with(nolock) where ID='{Id}' and name='{Name}'";
- return db.Database.SqlQuery<table_A>(sql).ToList();
复制代码 3. 节约时间开销
3.1 批量入库
- 假如有大量数据必要入数据库(比方上万行的excel表格),同时必要每条数据单独提取举行解析,再入库,若每行数据都分别入库,则会大量消耗时间。
- 采用先存列表,再批量入库的方法。
- public static void DBHelp.BulkInsert<T>(IList<T> list, string connStr, string tableName);
复制代码 批量入库(不检测库中是否有此记载,直接入库):
- list: 入库的数据聚集(本地映射类的列表)
- connStr: 毗连字符串
- tableName: 入库表名
3.2 批量查询
- 假如在每次循环中都必要查询数据库,非常耗时,可以在进入循环前一次性批量查库,结果存为列表,供循环内部搜索,可以大大提高检索效率,若将查询结果存为字典,则进一步提高速率。
3.3 案例
- 下面这篇博客使用一个简朴的案例,通过 “多次查库入库 → 批量(一次性)查库入库、list检索 → 字典检索” ,逐步提高检索效率。
文本文档解析入库流程优化
总结
持续更新-ing,未完待续 ~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |