当前位置:   article > 正文

【个人博客搭建】(5)Sqlsugar实体创建数据库数据_sqlsuger 新增数据

sqlsuger 新增数据

1、在appsettings.json文件中配置SqlServer数据库连接字符串信息。(后续考虑添加MySQL数据库等类型)

  1. "DBS": [
  2. /*
  3. 对应下边的 DBType
  4. MySql = 0,
  5. SqlServer = 1,
  6. */
  7. {
  8. "ConnId": "plateau.poetize.2024",
  9. "DBType": 1,
  10. "Connection": "Data Source=DESKTOP-1AFG6N7\\YGRSZC;Initial Catalog=plateau.poetize;Persist Security Info=True;User ID=sa;Password=123456",
  11. }
  12. ]

2、创建sqlsugar对象。

        2.1、注入服务。在Program.cs文件中,在var app = builder.Build();这句话之前,加入下列代码(需要添加sqlsugar nuget引用)

来源:简单示例,1分钟入门 - SqlSugar 5x - .NET果糖网。【1.2 原生模式使用IOC】

  1. //注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
  2. services.AddHttpContextAccessor();
  3. //注册SqlSugar用AddScoped
  4. services.AddScoped<ISqlSugarClient>(s =>
  5. {
  6. //Scoped用SqlSugarClient
  7. SqlSugarClient sqlSugar = new SqlSugarClient (new ConnectionConfig()
  8. {
  9. DbType = SqlSugar.DbType.Sqlite,
  10. ConnectionString = "DataSource=sqlsugar-dev.db",
  11. IsAutoCloseConnection = true,
  12. },
  13. db =>
  14. {
  15. //每次上下文都会执行
  16. //获取IOC对象不要求在一个上下文
  17. //var log=s.GetService<Log>()
  18. //获取IOC对象要求在一个上下文
  19. //var appServive = s.GetService<IHttpContextAccessor>();
  20. //var log= appServive?.HttpContext?.RequestServices.GetService<Log>();
  21. db.Aop.OnLogExecuting = (sql, pars) =>
  22. {
  23. };
  24. });
  25. return sqlSugar;
  26. });

        2.2、读取json文件处理方法。在Tools项目下创建AppSettings类。

我这里会引用Microsoft.Extensions.Configuration.Abstractions、Microsoft.Extensions.Configuration.Binder两个包。也可以百度其他方式实现

  1. using Microsoft.Extensions.Configuration;
  2. /// <summary>
  3. /// appsettings.json操作类
  4. /// </summary>
  5. public class AppSettings
  6. {
  7. //引用Microsoft.Extensions.Configuration.Abstractions
  8. public static IConfiguration Configuration { get; set; }
  9. public AppSettings(IConfiguration configuration)
  10. {
  11. Configuration = configuration;
  12. }
  13. /// <summary>
  14. /// 封装要操作的字符
  15. /// </summary>
  16. /// <param name="sections">节点配置</param>
  17. /// <returns></returns>
  18. public static string app(params string[] sections)
  19. {
  20. try
  21. {
  22. if (sections.Any())
  23. {
  24. return Configuration[string.Join(":", sections)];
  25. }
  26. }
  27. catch (Exception)
  28. {
  29. }
  30. return "";
  31. }
  32. /// <summary>
  33. /// 递归获取配置信息数组
  34. /// </summary>
  35. /// <typeparam name="T"></typeparam>
  36. /// <param name="sections"></param>
  37. /// <returns></returns>
  38. public static List<T> app<T>(params string[] sections)
  39. {
  40. List<T> list = new List<T>();
  41. // 引用 Microsoft.Extensions.Configuration.Binder 包
  42. Configuration.Bind(string.Join(":", sections), list);
  43. return list;
  44. }
  45. /// <summary>
  46. /// 根据路径 configuration["App:Name"];
  47. /// </summary>
  48. /// <param name="sectionsPath"></param>
  49. /// <returns></returns>
  50. public static string GetValue(string sectionsPath)
  51. {
  52. try
  53. {
  54. return Configuration[sectionsPath];
  55. }
  56. catch (Exception)
  57. {
  58. }
  59. return "";
  60. }
  61. }

        2.3、使用模型来接收配置的参数json数据格式

  1. /// <summary>
  2. /// 数据库模型
  3. /// </summary>
  4. public class DBSOperate
  5. {
  6. /// <summary>
  7. /// 连接ID
  8. /// </summary>
  9. public string ConnId { get; set; }
  10. /// <summary>
  11. /// 连接字符串
  12. /// </summary>
  13. public string Connection { get; set; }
  14. /// <summary>
  15. /// 数据库类型
  16. /// </summary>
  17. public DataBaseType DbType { get; set; }
  18. }
  19. public enum DataBaseType
  20. {
  21. MySql = 0,
  22. SqlServer = 1,
  23. }

        2.4、读取数据。然后把找到的值代替到创建SqlSugarClient sqlSugar的参数中去。(这里因为目前就规划两种数据库,所以简单判断一下,并以SqlServer为主)

  1. //获取json数据库配置
  2. List<DBSOperate> listdatabase = AppSettings.app<DBSOperate>("DBS").ToList();
  3. var ConnectionString = listdatabase.FirstOrDefault().Connection;
  4. DbType dbtype = (int)listdatabase.FirstOrDefault().DbType == 2 ? SqlSugar.DbType.MySql : SqlSugar.DbType.SqlServer;

        2.5、添加SQL语句打印。我们选用Aop.OnLogExecuted下执行。内容可以自定义。

也可以拓展一些别的aop。可以去看官方AOP、日志、拦截、差异日志 - SqlSugar 5x - .NET果糖网

  1. //SQL执行完
  2. db.Aop.OnLogExecuted = (sql, par) =>
  3. {
  4. //SQL语句打印
  5. Console.WriteLine("\r\n");
  6. Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")}执行的SQL语句是:" + sql);
  7. Console.WriteLine("=============================================");
  8. };

3、创建表。(后加到接口去)

  1. //【TODO:Source】 https://www.donet5.com/home/Doc?typeId=1206 2.1 纯特性建表(建表、批量建表)
  2. /***批量创建表***/
  3. //语法1:
  4. var modelsName = "plateau.poetize.blog.Models";
  5. Type[] types = Assembly
  6. .LoadFrom(modelsName + ".dll")//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe
  7. .GetTypes().Where(it => it.FullName.Contains(modelsName +".Entitys"))//命名空间过滤,可以写其他条件
  8. .ToArray();//断点调试一下是不是需要的Type,不是需要的在进行过滤
  9. db.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表

4、测试。

        4.1、报错,AppSettings的app方法,Configuration=null。问题点是没有注册进去。加进去即可,建议在sqlsugar之前吧。

  1. #region 读取Json配置文件
  2. builder.Services.AddSingleton(new AppSettings(builder.Configuration));
  3. #endregion

        4.2、运行成功。

(ps:No operations defined in spec!翻译为:规范中没有定义任何操作!)

这是因为我把原始的案例接口文件给删除了,后加接口即可

5、添加接口测试。

        5.1、添加文件,在Api项目下Controller文件夹右击添加控制器,然后选用api,再选空的那个。再修改成自己想需要的名称即可

创建成功后就是默认的一些代码。

这里

[Route]:代表路由,我这改成了[Route("blogApi/[controller]/[action]")],

        第一节blogApi代表一个前缀的功能,也可以再多加几节都可以。

        [controller]代表的是:当前控制器的名称,运行后也就是SqlSugar这几个字

        [action]代表的是:当前控制器下的接口名称

[ApiController]:这个就是代表api的特性标识,后续的swagger就是依据这生成的。

        5.2、添加接口

                5.2.1、控制器层:

  1. [Route("blogApi/[controller]/[action]")]
  2. [ApiController]
  3. public class SqlSugarController : ControllerBase
  4. {
  5. public ISqlSugarToolService _iSQLSugarToolService;
  6. public SqlSugarController(ISqlSugarToolService iSQLSugarToolService)
  7. {
  8. _iSQLSugarToolService = iSQLSugarToolService;
  9. }
  10. /// <summary>
  11. /// 测试连接
  12. /// </summary>
  13. /// <returns></returns>
  14. [HttpGet]
  15. public string Test()
  16. {
  17. return "Test,OK";
  18. }
  19. /// <summary>
  20. /// 初始化。根据实体生成数据库表
  21. /// </summary>
  22. /// <returns></returns>
  23. [HttpPost]
  24. public string InitDataStructure()
  25. {
  26. var result = _iSQLSugarToolService.InitDataStructure();
  27. return result;
  28. }
  29. }

                5.2.2、接口层:

  1. public interface ISqlSugarToolService
  2. {
  3. string InitDataStructure();
  4. }

                5.2.3、服务层

  1. public class SqlSugarToolService : ISqlSugarToolService
  2. {
  3. private ISqlSugarClient _sqlSugarClient;
  4. public SqlSugarToolService(ISqlSugarClient sqlSugarClient)
  5. {
  6. _sqlSugarClient = sqlSugarClient;
  7. }
  8. public string InitDataStructure()
  9. {
  10. var result = "未成功";
  11. try
  12. {
  13. //【TODO:Source】 https://www.donet5.com/home/Doc?typeId=1206 2.1 纯特性建表(建表、批量建表)
  14. /***批量创建表***/
  15. //语法1:
  16. var modelsName = "plateau.poetize.blog.Models";
  17. Type[] types = Assembly
  18. .LoadFrom(modelsName + ".dll")//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe
  19. .GetTypes()
  20. .Where(it => it.IsClass ==true && it.FullName.Contains(modelsName + ".Entitys"))//命名空间过滤,可以写其他条件
  21. .ToArray();//断点调试一下是不是需要的Type,不是需要的在进行过滤
  22. //循环处理
  23. foreach (var type in types)
  24. {
  25. // 这里只支持添加表,不支持删除
  26. // 如果想要删除,数据库直接右键删除
  27. if (!_sqlSugarClient.DbMaintenance.IsAnyTable(type.Name))
  28. {
  29. Console.WriteLine(type.Name);
  30. _sqlSugarClient.CodeFirst.SplitTables().InitTables(type);
  31. }
  32. }
  33. 直接
  34. //_sqlSugarClient.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表
  35. }
  36. catch (Exception ex)
  37. {
  38. result = "异常失败。" + ex.Message.ToString();
  39. throw;
  40. }
  41. return result;
  42. }
  43. }

5.3、运行:

        5.3.1、失败:

        5.3.2、处理问题。(接口与服务层实现问题)在入口文件中添加关系。

  1. #region 接口与服务层关系
  2. builder.Services.AddTransient<ISqlSugarToolService, SqlSugarToolService>();
  3. #endregion

        5.3.3、测试Test接口。我稍微改了下接口,加了输入的文字

        5.3.4、测试最后的生成表接口。

                出现问题:1、系统找不到指定的文件。(路径出现问题了)

修改代码:添加绝对路径。

  1. var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
  2. .LoadFrom(path + modelsName + ".dll")

修复后:

                出现问题:2、SqlSugar.SqlSugarException:“中文提示 :  连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. (Parameter 'name')
en-us is an invalid culture identifier.DbType="SqlServer";ConfigId="".
English Message : Connection open error . Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. (Parameter 'name')
en-us is an invalid culture identifier.DbType="SqlServer";ConfigId="" ”

问题点出现在代码:if (!_sqlSugarClient.DbMaintenance.IsAnyTable(type.Name))这。

处理方式:双击Api项目,然后修改InvariantGlobalization节点的值为false,默认为true。

(创建Net8 WebApi配套sqlsugar都会出现)

        5.3.5、最后也就是处理完成了。顺利生成。然后附带一下打印的SQL。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/950635
推荐阅读
相关标签
  

闽ICP备14008679号