天天看點

[NewLife.XCode]增删改查入門增删改查入門

NewLife.XCode是一個有10多年曆史的開源資料中間件,由新生命團隊(2002~2019)開發完成并維護至今,以下簡稱XCode。

整個系列教程會大量結合示例代碼和運作日志來進行深入分析,蘊含多年開發經驗于其中。

開源位址:https://github.com/NewLifeX/X (求star, 620+)

增删改查入門

建立控制台項目(.NET Core),從nuget引用NewLife.XCode,(也可以從别的項目引用下載下傳後拷貝XCode.dll和NewLife.Core.dll來使用,區分nfx和netcore版本),敲入以下代碼

// 啟用控制台日志
XTrace.UseConsole();

// 添加
var user = new UserX
{
    Name = "大石頭",
    Enable = true
};
user.Insert();
// 自增字段user.ID已經取得值
XTrace.WriteLine("使用者ID:{0}", user.ID);

// 查詢
var user2 = UserX.Find(UserX._.Name == "大石頭");

// 更新
user2.Logins++;
user2.LastLogin = DateTime.Now;
user2.Update();

// 删除
var user3 = UserX.FindByID(user.ID);
user3.Delete();

Console.ReadLine();           

複制

先跑起來看看效果:

#Software: ConsoleApp4
#ProcessID: 21252 x64
#AppDomain: ConsoleApp4
#FileName: C:\Program Files\dotnet\dotnet.exe
#BaseDirectory: D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\
#CommandLine: D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\ConsoleApp4.dll
#ApplicationType: Console
#CLR: 4.0.30319.42000, 
#OS: Microsoft Windows NT 6.2.9200.0, X3/Stone
#CPU: 8
#GC: IsServerGC=False, LatencyMode=Interactive
#Date: 2019-02-25
#字段: 時間 線程ID 線程池Y網頁W普通N 線程名 消息内容
#Fields: Time ThreadID IsPoolThread ThreadName Message
22:57:13.089  1 N - NewLife.Core v8.0.2019.0101 Build 2019-01-26 23:22:36 
22:57:13.104  1 N - 新生命X元件核心庫 ©2002-2019 新生命開發團隊
22:57:13.114  1 N - ConsoleApp4 v1.0.0.0 Build 2000-01-01 
22:57:13.115  1 N - ConsoleApp4 
22:57:13.115  1 N - Setting的配置檔案Config\Core.config 不存在,準備用預設配置覆寫!
22:57:13.277  1 N - Setting的配置檔案Config\XCode.config 不存在,準備用預設配置覆寫!
22:57:13.282  1 N - XCode v9.10.2019.0101 Build 2019-01-26 23:22:38 
22:57:13.282  1 N - 資料中間件 ©2002-2019 新生命開發團隊
22:57:13.628  1 N - 自動為[Membership]設定SQLite連接配接字元串:Data Source=.\Membership.db;Migration=On
22:57:13.652  1 N - System.Data.SQLite.dll不存在或平台版本不正确,準備聯網擷取 http://x.newlifex.com/
22:57:13.835  1 N - 下載下傳連結 http://x.newlifex.com/,目标 System.Data.SQLite.win-x64,System.Data.SQLite.win,System.Data.SQLite.st,System.Data.SQLite
22:57:13.964  4 Y 1 WebClientX.Get http://x.newlifex.com/
22:57:15.660  1 N - 分析得到檔案 System.Data.SQLite.win-x64_20180823112512.zip,準備下載下傳 http://x.newlifex.com/System.Data.SQLite.win-x64_20180823112512.zip
22:57:15.663  4 Y 19 WebClientX.Get http://x.newlifex.com/System.Data.SQLite.win-x64_20180823112512.zip
22:57:16.897  1 N - 下載下傳完成,共924,475位元組,耗時1,232毫秒
22:57:16.897  1 N - 解壓縮到 D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Plugins
22:57:17.074  1 N - TypeX.GetType("System.Data.SQLite.SQLiteFactory") => Plugins\System.Data.SQLite.dll
22:57:17.074  1 N - System.Data.SQLite驅動D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Plugins\System.Data.SQLite.dll 版本v1.0.109.0
22:57:17.145  1 N - Data Source=D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Membership.db;Cache Size=-524288;Synchronous=Off;Journal Mode=WAL
22:57:17.154  4 Y 198 檢查實體XCode.Membership.UserX的資料表架構,模式:CheckTableWhenFirstUse
22:57:17.160  4 Y 198 建立資料庫:Membership
22:57:17.161  4 Y 198 建立資料庫:D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Membership.db
22:57:17.181  4 Y 198 select * from sqlite_master
22:57:17.284  4 Y 198 建立表:User(使用者)
22:57:17.298  4 Y 198 Create Table User(
    ID integer Primary Key AUTOINCREMENT,
    Name nvarchar(50) NOT NULL COLLATE NOCASE,
    Password nvarchar(50) NULL COLLATE NOCASE,
    DisplayName nvarchar(50) NULL COLLATE NOCASE,
    Sex int NOT NULL,
    Mail nvarchar(50) NULL COLLATE NOCASE,
    Mobile nvarchar(50) NULL COLLATE NOCASE,
    Code nvarchar(50) NULL COLLATE NOCASE,
    Avatar nvarchar(200) NULL COLLATE NOCASE,
    RoleID int NOT NULL,
    RoleIDs nvarchar(200) NULL COLLATE NOCASE,
    DepartmentID int NOT NULL,
    Online bit NOT NULL,
    Enab...etime NULL,
    LastLoginIP nvarchar(50) NULL COLLATE NOCASE,
    RegisterTime datetime NULL,
    RegisterIP nvarchar(50) NULL COLLATE NOCASE,
    Ex1 int NOT NULL,
    Ex2 int NOT NULL,
    Ex3 real NOT NULL,
    Ex4 nvarchar(50) NULL COLLATE NOCASE,
    Ex5 nvarchar(50) NULL COLLATE NOCASE,
    Ex6 nvarchar(50) NULL COLLATE NOCASE,
    UpdateUser nvarchar(50) NULL COLLATE NOCASE,
    UpdateUserID int NOT NULL,
    UpdateIP nvarchar(50) NULL COLLATE NOCASE,
    UpdateTime datetime NULL,
    Remark nvarchar(200) NULL COLLATE NOCASE
)
22:57:17.309  4 Y 198 Create Unique Index IU_User_Name On User (Name)
22:57:17.311  4 Y 198 Create Index IX_User_RoleID On User (RoleID)
22:57:17.312  4 Y 198 Create Index IX_User_UpdateTime On User (UpdateTime)
22:57:17.320  4 Y 198 UserX.Count 快速計算表記錄數(非精确)[User/Membership] 參考值 -2
22:57:17.332  4 Y 198 開始檢查連接配接[Membership/SQLite]的資料庫架構……
22:57:17.355  4 Y 198 [Membership]的所有實體類(5個):Parameter,UserX,Menu,Role,Department
22:57:17.356  4 Y 198 [Membership]需要檢查架構的實體類(1個):Parameter
22:57:17.357  4 Y 198 Membership待檢查表架構的實體個數:1
22:57:17.358  4 Y 198 select * from sqlite_master
22:57:17.365  4 Y 198 建立表:Parameter(字典參數)
22:57:17.368  4 Y 198 Create Table Parameter(
    ID integer Primary Key AUTOINCREMENT,
    Category nvarchar(50) NULL COLLATE NOCASE,
    Name nvarchar(50) NULL COLLATE NOCASE,
    Value nvarchar(200) NULL COLLATE NOCASE,
    LongValue nvarchar(2000) NULL COLLATE NOCASE,
    Kind int NOT NULL,
    Enable bit NOT NULL,
    Ex1 int NOT NULL,
    Ex2 int NOT NULL,
    Ex3 real NOT NULL,
    Ex4 nvarchar(50) NULL COLLATE NOCASE,
    Ex5 nvarchar(50) NULL COLLATE NOCASE,
    Ex6 nvarchar(50) NULL COLLATE NOCASE,
    CreateUser nvarchar(50) NULL COLLATE NOCASE,
    CreateUserID int NOT NULL,
    CreateIP nvarchar(50) NULL COLLATE NOCASE,
    CreateTime datetime NULL,
    UpdateUser nvarchar(50) NULL COLLATE NOCASE,
    UpdateUserID int NOT NULL,
    UpdateIP nvarchar(50) NULL COLLATE NOCASE,
    UpdateTime datetime NULL,
    Remark nvarchar(200) NULL COLLATE NOCASE
)
22:57:17.369  4 Y 198 Create Unique Index IU_Parameter_Category_Name On Parameter (Category, Name)
22:57:17.370  4 Y 198 Create Index IX_Parameter_Name On Parameter (Name)
22:57:17.370  4 Y 198 Create Index IX_Parameter_UpdateTime On Parameter (UpdateTime)
22:57:17.372  4 Y 198 檢查連接配接[Membership/SQLite]的資料庫架構耗時38ms
22:57:17.383  4 Y 198 Select * From User Order By ID Desc limit 1
22:57:17.388  4 Y 198 Select Count(*) From User
22:57:17.398  4 Y 198 Select Count(*) From User
22:57:17.401  4 Y 198 開始初始化UserX使用者資料……
22:57:17.455  4 Y 198 Insert Into User(Name, Password, DisplayName, Sex, Mail, Mobile, Code, Avatar, RoleID, RoleIDs, DepartmentID, Online, Enable, Logins, LastLogin, LastLoginIP, RegisterTime, RegisterIP, Ex1, Ex2, Ex3, Ex4, Ex5, Ex6, UpdateUser, UpdateUserID, UpdateIP, UpdateTime, Remark) Values('admin', '21232F297A57A5A743894A0E4A801FC3', '管理者', 0, null, null, null, null, 1, '', 0, 0, 1, 0, null, null, null, null, 0, 0, 0, null, null, null, null, 0, null, null, null);Select last_insert_rowid() newid
22:57:17.479  4 Y 198 自動為[Log]設定SQLite連接配接字元串:Data Source=.\Log.db;Migration=On
22:57:17.491  4 Y 198 Data Source=D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Log.db;Cache Size=-524288;Synchronous=Off;Journal Mode=WAL
22:57:17.514  4 Y 198 完成初始化UserX使用者資料!
22:57:17.548  1 N - Insert Into User(Name, Password, DisplayName, Sex, Mail, Mobile, Code, Avatar, RoleID, RoleIDs, DepartmentID, Online, Enable, Logins, LastLogin, LastLoginIP, RegisterTime, RegisterIP, Ex1, Ex2, Ex3, Ex4, Ex5, Ex6, UpdateUser, UpdateUserID, UpdateIP, UpdateTime, Remark) Values('大石頭', null, null, 0, null, null, null, null, 0, null, 0, 0, 1, 0, null, null, null, null, 0, 0, 0, null, null, null, null, 0, null, null, null);Select last_insert_rowid() newid
22:57:17.561  1 N - 使用者ID:2
22:57:17.574  1 N - Select * From User Where Name='大石頭' Order By ID Desc limit 1
22:57:17.601  1 N - Update User Set Logins=Logins+1, LastLogin='2019-02-25 22:57:17' Where ID=2
22:57:17.613  1 N - Select * From User Order By ID Desc
22:57:17.620  1 N - Delete From User Where ID=2
22:57:18.519  6 Y 199 檢查實體XCode.Membership.Log的資料表架構,模式:CheckTableWhenFirstUse
22:57:18.520  6 Y 199 建立資料庫:Log
22:57:18.521  6 Y 199 建立資料庫:D:\Test\ConsoleApp4\ConsoleApp4\bin\Debug\netcoreapp2.1\Log.db
22:57:18.532  6 Y 199 建立表:Log(日志)
22:57:18.537  4 Y EQ 開始檢查連接配接[Log/SQLite]的資料庫架構……
22:57:18.555  4 Y EQ [Log]的所有實體類(3個):Log,UserOnline,VisitStat
22:57:18.555  4 Y EQ [Log]需要檢查架構的實體類(2個):UserOnline,VisitStat
22:57:18.558  4 Y EQ Log待檢查表架構的實體個數:2
22:57:18.559  4 Y EQ 建立表:UserOnline(使用者線上)
22:57:18.561  4 Y EQ 建立表:VisitStat(通路統計)
22:57:18.564  4 Y EQ 檢查連接配接[Log/SQLite]的資料庫架構耗時24ms           

複制

這是前述代碼的完整執行日志,這裡我們不做過多分析。

日志大意是:自動配置SQLite資料庫,下載下傳平台要求的SQLite驅動,建庫建表,增删改查

這裡特别需要關注的是這幾行:

22:57:17.548  1 N - Insert Into User(Name, Password, DisplayName, Sex, Mail, Mobile, Code, Avatar, RoleID, RoleIDs, DepartmentID, Online, Enable, Logins, LastLogin, LastLoginIP, RegisterTime, RegisterIP, Ex1, Ex2, Ex3, Ex4, Ex5, Ex6, UpdateUser, UpdateUserID, UpdateIP, UpdateTime, Remark) Values('大石頭', null, null, 0, null, null, null, null, 0, null, 0, 0, 1, 0, null, null, null, null, 0, 0, 0, null, null, null, null, 0, null, null, null);Select last_insert_rowid() newid
22:57:17.561  1 N - 使用者ID:2
22:57:17.574  1 N - Select * From User Where Name='大石頭' Order By ID Desc limit 1
22:57:17.601  1 N - Update User Set Logins=Logins+1, LastLogin='2019-02-25 22:57:17' Where ID=2
22:57:17.613  1 N - Select * From User Order By ID Desc
22:57:17.620  1 N - Delete From User Where ID=2           

複制

一句user.Insert,生成了一個Insert Into語句,并取得自增字段指派給ID。

一個簡單的Find單字段查找,通過user2.Update更新了兩個字段,user3.Delete則删除了這行資料。

這就是一個完整的增删改查!

短短的一段代碼,也許帶給你許多疑問,這些疑問都将在後續文章中得到詳細解答:

  • UserX類來自哪裡?(XCode内置權限體系Membership)
  • 為何不需要配置資料庫?(無配置時預設使用SQLite)
  • 下載下傳了什麼東西?(SQLite驅動分為.Net2.0/.Net4.0/.Net4.5等,還有.netstandard以及Linux版本之分,XCode根據平台自動下載下傳正确版本)
  • 為何會自動建表?(這是XCode最為強大的反向工程,2008年開始支援,類似于EF後來的資料遷移)
  • 自增ID。Insert後會即刻取回新插入的自增值
  • Logins=Logins+1。這叫做累加字段
  • UserX.FindByID為何生成不帶where的Select查詢?(UserX.FindByID内部帶有實體緩存,并非簡單的Find(ID==2))