大连密封材料 发表于 2025-3-28 21:00:25

AI岗实习疑难杂症小记(一些重要而小众的题目心得)——数据库(SQL Server)相干篇(C#)

提示:某上市公司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_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
}

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 构建本地映射类对象



[*]方法1:
table_A Model = new table_A();
Model.TDATE = date;
Model.SYMBOL = "AAA";
//...


[*]方法2:(常用)
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 数据更新



[*]使用到lamda表达式找到对应记载举行修改。
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企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: AI岗实习疑难杂症小记(一些重要而小众的题目心得)——数据库(SQL Server)相干篇(C#)