GPI电子Discuz!X/数据库 DB:: 函数操作方法

作者:计算机专家

昨晚完成了Web端新增图书信息的功能,现在就差DB的具体实现了。

前面的书房初始化的前端信息已经完善,所以现在开始实现DB的Script部分。

DB::table($tablename)获取正确带前缀的表名,转换数据库句柄,

因为我把Book相关的信息拆分的比较多,所以更新有点小麻烦。

新增Action:Shelf_Init.sql

DB::delete($tablename, 条件,条数限制)删除表中的数据

首先,我需要创建一个Book Type的Matter;

GPI电子 1

DB::insert($tablename, 数据(数组),是否返回插入ID,是否是替换式,是否silent)插入数据操作

然后,将图片路径保存到FileBank中,并返回FileBankID;

svc.sql

DB::update($tablename, 数据(数组)条件)更新操作

继续,插入Publisher信息(需要判断name不存在才会insert),然后返回PublisherID;

1 CREATE SCHEMA [svc]
2     AUTHORIZATION [dbo];

DB::fetch(查询后的资源)从结果集中取关联数组,注意如果结果中的两个或以上的列具有相同字段名,最后一列将优先。

 1 CREATE PROCEDURE [base].[Publisher#Insert](@json nvarchar(max), @id int out)
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5 ...
 6 
 7         declare    @name nvarchar(100);
 8         select    @name=Publisher from openjson(@json, '$') with (Publisher nvarchar(100))
 9 
10         -- insert Publisher
11         insert    base._Publisher(Name)select @name
12         where    not exists(select 1 from base._Publisher p where p.Name=@name);
13 
14         select    @id=ID from base.Publisher#Raw() where Name=@name;
15 ...
16 END

Shelf_Init.sql

DB::fetch_first($sql)取查询的第一条数据fetch

 

 1 CREATE PROCEDURE [svc].[Shelf$Init](@json nvarchar(max))
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5     SET    NOCOUNT    ON;
 6     SET XACT_ABORT ON;
 7     BEGIN TRY
 8         BEGIN    TRAN;
 9 
10         declare    @nickName nvarchar(20), @shelfName nvarchar(20);
11         select    @nickName=NickName,     @shelfName=ShelfName
12         from    openjson (@json, '$')
13         with (
14             NickName        nvarchar(20),
15             ShelfName        nvarchar(20)
16         );
17 
18         insert    core._Party(Type, Alias) select k._User, @nickName
19         from    core.Party#Type() k;
20         declare    @userID int=@@identity;
21 
22         
23         insert    core._Party(PID, Type, Alias) select @userID, k._Shelf, @shelfName
24         from    core.Party#Type() k;
25 
26         COMMIT    TRAN;
27     END TRY
28     BEGIN CATCH
29         if (xact_state() = -1) ROLLBACK TRAN; throw;
30     END CATCH
31 END

DB::fetch_all($sql)查询并fetch

继续,插入Binding信息(也需要判断name不存在才insert),返回BindingID;

好了,我去试试前端能不能初始化信息进DB

DB::result_first($sql)查询结果集的第一个字段值

 1 CREATE PROCEDURE [base].[Binding#Insert](@json nvarchar(max), @id int out)
 2 WITH ENCRYPTION
 3 AS
 4 BEGIN
 5 ...
 6 
 7         declare    @name nvarchar(100);
 8         select    @name=Binding from openjson(@json, '$') with (Binding nvarchar(100))
 9 
10         -- insert Binding
11         insert    base._Binding(Name)select @name
12         where    not exists(select 1 from base._Binding p where p.Name=@name);
13 
14         select    @id=ID from base.Binding#Raw() where Name=@name;
15 
16 ...
17 END

....

DB::query($sql)普通查询

 

在测试之前,我们需要实现一下Init Razor Pages代码:

DB::num_rows(查询后的资源)获得记录集总条数

继续,插入Book信息;

Init.cshtml.cs

DB::_execute(命令,参数)执行mysql类的命令

继续,插入BookInfo的信息;

 1     using M = Shelf;
 2     public class InitModel : PageModel
 3     {
 4         private readonly IShelfRepo _shelfRepo;
 5         public InitModel(IShelfRepo shelfRepo)
 6         {
 7             _shelfRepo = shelfRepo;
 8         }
 9         [BindProperty]
10         public InitInputModel Input { get; set; }
11 
12         public void OnGet()
13         {
14 
15         }
16 
17         public async Task<IActionResult> OnPostAsync()
18         {
19             if (ModelState.IsValid)
20             {
21                 await _shelfRepo.InitAsync(new M.InitSpec
22                 {
23                     NickName = Input.NickName.Trim(),
24                     ShelfName = Input.ShelfName.Trim()
25                 });
26                 return RedirectToPage("New");
27             }
28             return Page();
29         }
30     }

DB::limit(n,n)返回限制字串

继续,插入BookNbr信息;

页面内容也需要修改一下form部分

DB::field(字段名, $pid) 返回条件,如果为数组则返回 in 条件

本文由杏彩发布,转载请注明来源

关键词: