You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sqlserver.md 2.4 KiB

4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # SQL Server
  2. SQL Server 是由微软开发的一个关系型数据库,你可以使用 SQL Server 来作为 CAP 消息的持久化。
  3. !!! warning "注意"
  4. 我们目前使用 `Microsoft.Data.SqlClient` 作为数据库驱动程序,它是SQL Server 驱动的未来,并且已经放弃了 `System.Data.SqlClient`,我们建议你切换过去。
  5. ## 配置
  6. 要使用 SQL Server 存储,你需要从 NuGet 安装以下扩展包:
  7. ```shell
  8. Install-Package DotNetCore.CAP.SqlServer
  9. ```
  10. 然后,你可以在 `Startup.cs` 的 `ConfigureServices` 方法中添加基于内存的配置项。
  11. ```csharp
  12. public void ConfigureServices(IServiceCollection services)
  13. {
  14. // ...
  15. services.AddCap(x =>
  16. {
  17. x.UseSqlServer(opt=>{
  18. //SqlServerOptions
  19. });
  20. // x.UseXXX ...
  21. });
  22. }
  23. ```
  24. ### 配置项
  25. NAME | DESCRIPTION | TYPE | DEFAULT
  26. :---|:---|---|:---
  27. Schema | 数据库架构 | string | Cap
  28. ConnectionString | 数据库连接字符串 | string |
  29. ### 自定义表名称
  30. 你可以通过重写 `IStorageInitializer` 接口获取表名称的方法来做到这一点
  31. 示例代码:
  32. ```C#
  33. public class MyTableInitializer : SqlServerStorageInitializer
  34. {
  35. public override string GetPublishedTableName()
  36. {
  37. //你的 发送消息表 名称
  38. }
  39. public override string GetReceivedTableName()
  40. {
  41. //你的 接收消息表 名称
  42. }
  43. }
  44. ```
  45. 然后将你的实现注册到容器中
  46. ```
  47. services.AddSingleton<IStorageInitializer, MyTableInitializer>();
  48. ```
  49. ## 使用事务发布消息
  50. ### ADO.NET
  51. ```csharp
  52. private readonly ICapPublisher _capBus;
  53. using (var connection = new SqlConnection("ConnectionString"))
  54. {
  55. using (var transaction = connection.BeginTransaction(_capBus, autoCommit: false))
  56. {
  57. //your business code
  58. connection.Execute("insert into test(name) values('test')",
  59. transaction: (IDbTransaction)transaction.DbTransaction);
  60. _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);
  61. transaction.Commit();
  62. }
  63. }
  64. ```
  65. ### EntityFramework
  66. ```csharp
  67. private readonly ICapPublisher _capBus;
  68. using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: false))
  69. {
  70. dbContext.Persons.Add(new Person() { Name = "ef.transaction" });
  71. _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);
  72. dbContext.SaveChanges();
  73. trans.Commit();
  74. }
  75. ```