1. 程式人生 > 其它 >sqlite-net-pcl-C#版_安裝與使用教

sqlite-net-pcl-C#版_安裝與使用教

一、安裝:

1、引用NuGet包:

  “sqlite-net-pcl”與“SQLitePCLRaw.bundle_green”NuGet包。

2、sqlite-net-pcl的“資料庫連線類”與“資料庫配置檔案”

  ① Sqilte幫助類-單例:

Sqilte幫助類-單例
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:Sqilte幫助類-單例                                                   
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 建立時間:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 名稱空間: Repository._Base                               
*│ 類    名:SQLiteDBBase(PracticeContext)                                     
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;
using System.Diagnostics;

namespace Repository._Base
{
    /// <summary>
    /// MAUI的Sqilte幫助類
    /// </summary>
    public class SQLiteDBBase
    {
        /// <summary>
        /// 資料庫連線操作物件
        /// </summary>
        internal static SQLiteAsyncConnection _SQLiteDBConnection;

        public SQLiteDBBase()
        {

        }

        /// <summary>
        /// 初始化連線
        /// </summary>
        public void Init()
        {
            if(SQLiteDBBase._SQLiteDBConnection is null)
            {
                SQLiteDBBase._SQLiteDBConnection = new SQLiteAsyncConnection(SQLiteDBConfg.DatabasePath, SQLiteDBConfg.Flags);
            }
            //var result = await Database.CreateTableAsync<TodoItem>();
        }

        /// <summary>
        /// 獲取SQLite資料庫檔案路徑
        /// </summary>
        /// <returns></returns>
        public string GetDatabaseFilePath()
        {
            return SQLiteDBBase._SQLiteDBConnection.DatabasePath;
        }

        /// <summary>
        /// 獲取SQLite的Lib版本
        /// </summary>
        /// <returns></returns>
        public int GetLibVersionNumber()
        {
            return SQLiteDBBase._SQLiteDBConnection.LibVersionNumber;
        }

        /// <summary>
        /// 獲取SQLite的DateTimeString格式
        /// </summary>
        /// <returns></returns>
        public string GetDateTimeStringFormat()
        {
            Debug.WriteLine(SQLiteDBBase._SQLiteDBConnection.DateTimeStringFormat);
            return SQLiteDBBase._SQLiteDBConnection.DateTimeStringFormat;
        }

        /// <summary>
        /// 獲取SQLite的TableMappings
        /// </summary>
        /// <returns></returns>
        public List<TableMapping> GetTableMappings()
        {
            return SQLiteDBBase._SQLiteDBConnection.TableMappings.ToList();
        }
    }
}

  ② SQLite配置資料:

SQLite配置資料
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite配置資料                                                   
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 建立時間:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 名稱空間: Repository._Base                               
*│ 類    名:SQLiteDBConfg                                     
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;
using System.Diagnostics;

namespace Repository._Base
{
    /// <summary>
    /// SQLite配置資料
    /// </summary>
    internal class SQLiteDBConfg
    {
        /// <summary>
        /// SQLite檔名
        /// </summary>
        private const string DatabaseFilename = "MengFeiYue.db3";

        /// <summary>
        /// SQLite路徑
        /// </summary>
        internal static string DatabasePath => Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);

        /// <summary>
        /// SQLite連線配置
        /// </summary>
        internal static readonly SQLite.SQLiteOpenFlags Flags =
            SQLite.SQLiteOpenFlags.Create |        // 如果連線不存在,連線將自動建立資料庫檔案
            SQLite.SQLiteOpenFlags.ReadWrite |     // 連線可以讀取和寫入資料。

            //SQLite.SQLiteOpenFlags.FullMutex |     // 連線在序列化執行緒模式下開啟。
            SQLite.SQLiteOpenFlags.NoMutex |       // 連線在多執行緒模式下開啟。

            SQLite.SQLiteOpenFlags.SharedCache |   // 如果連線已啟用,則連線將參與共享快取。
            //SQLite.SQLiteOpenFlags.PrivateCache |  // 即使連線已啟用,連線也不會參與共享快取。

            SQLite.SQLiteOpenFlags.ProtectionNone                                     // 資料庫檔案未加密。
            //SQLite.SQLiteOpenFlags.ProtectionComplete                               // 裝置鎖定時,檔案已加密且不可訪問。
            //SQLite.SQLiteOpenFlags.ProtectionCompleteUntilFirstUserAuthentication   // 檔案已加密,直到使用者啟動並解鎖裝置。
            //SQLite.SQLiteOpenFlags.ProtectionCompleteUnlessOpen                     // 檔案已加密,直到它開啟,但即使使用者鎖定裝置,也可以訪問該檔案。
            ;
    }
}

二、sqlite-net-pcl使用教程:

1、sqlite-net-pcl特徵講解

SQLite實體示例
 /**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite實體示例                                                  
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 建立時間:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 名稱空間: Model.Test                               
*│ 類    名:TableTest                                  
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;

namespace Model.Test
{
    /// <summary>
    /// 測試表
    /// </summary>
    public class TableTest
    {
        public TableTest() { }

        /// <summary>
        /// 主鍵,自增
        /// </summary>
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        /// <summary>
        /// 索引
        /// </summary>
        [Indexed]
        public string Name { get; set; }

        public string Pwd { get; set; }

        public string Description { get; set; }
    }
}

2、增刪改查等常見示例

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite資料操作示例                                                   
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 建立時間:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 名稱空間: Repository._Base                               
*│ 類    名:SQLiteDBDemo                                     
*└──────────────────────────────────────────────────────────────┘
*/
using Model.Test;
using SQLite;
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace Repository._Base
{
    /// <summary>
    /// SQLite資料操作示例
    /// </summary>
    public class SQLiteDBDemo:SQLiteDBBase
    {
        #region 新增表資料
        /// <summary>
        /// 新增資料
        /// </summary>
        /// <param name="tableTest">資料</param>
        /// <returns></returns>
        public int InsertTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.InsertAsync(tableTest).Result;
        }

        /// <summary>
        /// 新增多條表資料
        /// </summary>
        /// <param name="tableTests">資料</param>
        /// <param name="runInTransaction">是否使用事務</param>
        /// <returns></returns>
        public int InsertTableDatasDemo(List<TableTest> tableTests, bool runInTransaction = true)
        {
            return _SQLiteDBConnection.InsertAllAsync(tableTests, runInTransaction).Result;
        }
        
        #endregion 新增表資料

        #region 刪除表資料
        /// <summary>
        /// 刪除資料
        /// </summary>
        /// <param name="tableTest"></param>
        /// <returns></returns>
        public int DeleteTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.DeleteAsync(tableTest).Result;
        }
        #endregion 刪除表資料

        #region 修改表資料
        /// <summary>
        /// 更新資料
        /// </summary>
        /// <param name="tableTest">資料</param>
        /// <returns></returns>
        public int UpdateTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.UpdateAsync(tableTest).Result;
        }

        /// <summary>
        /// 更新所有的表資料
        /// </summary>
        /// <param name="tableTests">資料</param>
        /// <param name="runInTransaction">是否使用事務</param>
        /// <returns></returns>
        public int UpdateAllTableDataDemo(List<TableTest> tableTests,bool runInTransaction = true)
        {
            return _SQLiteDBConnection.UpdateAllAsync(tableTests, runInTransaction).Result;
        }
        #endregion 修改表資料

        #region 查詢表資料
        /// <summary>
        /// 查詢
        /// </summary>
        /// <param name="tableTest">條件</param>
        /// <returns></returns>
        public List<TableTest> QueryTableDataByWhere(TableTest tableTest)
        {
            return _SQLiteDBConnection.QueryAsync<TableTest>("select * from TableTest where Name=? and Pwd=?", tableTest.Name, tableTest.Pwd).Result;
        }

        /// <summary>
        /// 通過Id獲取一條資料
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public TableTest GetTableDataById(int id)
        {
            return _SQLiteDBConnection.QueryAsync<TableTest>("select * from TableTest where Id=?", id).Result.FirstOrDefault();
        }

        /// <summary>
        /// 查詢全部的資料
        /// 返回一個可供查詢的表,後篩選
        /// </summary>
        /// <param name="tableTest">條件</param>
        /// <returns></returns>
        public List<TableTest> GetTableDataByWhere(TableTest tableTest=null)
        {
            if (tableTest !=null)
            {
                return _SQLiteDBConnection.Table<TableTest>().Where(t => t.Name == tableTest.Name).ToListAsync().Result;
            }
            else
            {
                return _SQLiteDBConnection.Table<TableTest>().ToListAsync().Result;
            }
        }
        #endregion 查詢表資料

        #region 事務
        // 執行事務
        public void RunInTransactionAsync()
        {
            // 操作
            TableTest insertObj = new();
            TableTest updateObj = new();
            TableTest deleteObj = new();

             _SQLiteDBConnection.RunInTransactionAsync(tran =>
            {
                // database calls inside the transaction
                tran.Insert(insertObj);
                tran.Update(updateObj);
                tran.Delete(deleteObj);
            });
        }
        #endregion 事務

        #region 建立表
        /// <summary>
        /// 建立表
        /// </summary>
        public void CtreatTableDemo()
        {
            _SQLiteDBConnection.CreateTableAsync<TableTest>();
        }
        #endregion 建立表

        #region 刪除表
        /// <summary>
        /// 刪除表
        /// </summary>
        public void DropTableDemo()
        {
            _SQLiteDBConnection.DropTableAsync<TableTest>();
        }

        #endregion 刪除表

        #region 新增列或修改列、刪除列結構;新增、刪除索引
        /// <summary>
        /// 新增列或修改列結構
        /// </summary>
        public void ModifyColumnsForTableDemo()
        {
            _SQLiteDBConnection.CreateTableAsync<TableTest>();
        }
        #endregion 新增列或修改列、刪除列結構;

        #region 新增、刪除索引(可以用特徵指定)
        /// <summary>
        /// 建立索引
        /// </summary>
        public int CreateIndexAsync()
        {
            TableTest tableTest = new();
            string indexName = "TTName_Index";  // 索引名
            bool unique = false;  // 是否唯一索引

            //return _SQLiteDBConnection.CreateIndexAsync(nameof(TableTest), nameof(tableTest.Name), unique).Result;  // 單個列索引
            return _SQLiteDBConnection.CreateIndexAsync(indexName, nameof(TableTest), nameof(tableTest.Name), unique).Result;  // 單個列索引_指定索引名
            //return _SQLiteDBConnection.CreateIndexAsync(nameof(TableTest),new string[] { nameof(tableTest.Name), nameof(tableTest.Pwd), nameof(tableTest.Description) }, unique).Result;  // 多個列索引
        }

        #endregion 新增、刪除索引(可以用特徵指定)
    }
}

一、安裝:

1、引用NuGet包:

  “sqlite-net-pcl”與“SQLitePCLRaw.bundle_green”NuGet包。

2、sqlite-net-pcl的“資料庫連線類”與“資料庫配置檔案”

  ① Sqilte幫助類-單例:

Sqilte幫助類-單例
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:Sqilte幫助類-單例                                                   
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 建立時間:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 名稱空間: Repository._Base                               
*│ 類    名:SQLiteDBBase(PracticeContext)                                     
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;
using System.Diagnostics;

namespace Repository._Base
{
    /// <summary>
    /// MAUI的Sqilte幫助類
    /// </summary>
    public class SQLiteDBBase
    {
        /// <summary>
        /// 資料庫連線操作物件
        /// </summary>
        internal static SQLiteAsyncConnection _SQLiteDBConnection;

        public SQLiteDBBase()
        {

        }

        /// <summary>
        /// 初始化連線
        /// </summary>
        public void Init()
        {
            if(SQLiteDBBase._SQLiteDBConnection is null)
            {
                SQLiteDBBase._SQLiteDBConnection = new SQLiteAsyncConnection(SQLiteDBConfg.DatabasePath, SQLiteDBConfg.Flags);
            }
            //var result = await Database.CreateTableAsync<TodoItem>();
        }

        /// <summary>
        /// 獲取SQLite資料庫檔案路徑
        /// </summary>
        /// <returns></returns>
        public string GetDatabaseFilePath()
        {
            return SQLiteDBBase._SQLiteDBConnection.DatabasePath;
        }

        /// <summary>
        /// 獲取SQLite的Lib版本
        /// </summary>
        /// <returns></returns>
        public int GetLibVersionNumber()
        {
            return SQLiteDBBase._SQLiteDBConnection.LibVersionNumber;
        }

        /// <summary>
        /// 獲取SQLite的DateTimeString格式
        /// </summary>
        /// <returns></returns>
        public string GetDateTimeStringFormat()
        {
            Debug.WriteLine(SQLiteDBBase._SQLiteDBConnection.DateTimeStringFormat);
            return SQLiteDBBase._SQLiteDBConnection.DateTimeStringFormat;
        }

        /// <summary>
        /// 獲取SQLite的TableMappings
        /// </summary>
        /// <returns></returns>
        public List<TableMapping> GetTableMappings()
        {
            return SQLiteDBBase._SQLiteDBConnection.TableMappings.ToList();
        }
    }
}

  ② SQLite配置資料:

SQLite配置資料
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite配置資料                                                   
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 建立時間:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 名稱空間: Repository._Base                               
*│ 類    名:SQLiteDBConfg                                     
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;
using System.Diagnostics;

namespace Repository._Base
{
    /// <summary>
    /// SQLite配置資料
    /// </summary>
    internal class SQLiteDBConfg
    {
        /// <summary>
        /// SQLite檔名
        /// </summary>
        private const string DatabaseFilename = "MengFeiYue.db3";

        /// <summary>
        /// SQLite路徑
        /// </summary>
        internal static string DatabasePath => Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);

        /// <summary>
        /// SQLite連線配置
        /// </summary>
        internal static readonly SQLite.SQLiteOpenFlags Flags =
            SQLite.SQLiteOpenFlags.Create |        // 如果連線不存在,連線將自動建立資料庫檔案
            SQLite.SQLiteOpenFlags.ReadWrite |     // 連線可以讀取和寫入資料。

            //SQLite.SQLiteOpenFlags.FullMutex |     // 連線在序列化執行緒模式下開啟。
            SQLite.SQLiteOpenFlags.NoMutex |       // 連線在多執行緒模式下開啟。

            SQLite.SQLiteOpenFlags.SharedCache |   // 如果連線已啟用,則連線將參與共享快取。
            //SQLite.SQLiteOpenFlags.PrivateCache |  // 即使連線已啟用,連線也不會參與共享快取。

            SQLite.SQLiteOpenFlags.ProtectionNone                                     // 資料庫檔案未加密。
            //SQLite.SQLiteOpenFlags.ProtectionComplete                               // 裝置鎖定時,檔案已加密且不可訪問。
            //SQLite.SQLiteOpenFlags.ProtectionCompleteUntilFirstUserAuthentication   // 檔案已加密,直到使用者啟動並解鎖裝置。
            //SQLite.SQLiteOpenFlags.ProtectionCompleteUnlessOpen                     // 檔案已加密,直到它開啟,但即使使用者鎖定裝置,也可以訪問該檔案。
            ;
    }
}

二、sqlite-net-pcl使用教程:

1、sqlite-net-pcl特徵講解

SQLite實體示例
 /**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite實體示例                                                  
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 建立時間:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 名稱空間: Model.Test                               
*│ 類    名:TableTest                                  
*└──────────────────────────────────────────────────────────────┘
*/
using SQLite;

namespace Model.Test
{
    /// <summary>
    /// 測試表
    /// </summary>
    public class TableTest
    {
        public TableTest() { }

        /// <summary>
        /// 主鍵,自增
        /// </summary>
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        /// <summary>
        /// 索引
        /// </summary>
        [Indexed]
        public string Name { get; set; }

        public string Pwd { get; set; }

        public string Description { get; set; }
    }
}

2、增刪改查等常見示例

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:SQLite資料操作示例                                                   
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 建立時間:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 名稱空間: Repository._Base                               
*│ 類    名:SQLiteDBDemo                                     
*└──────────────────────────────────────────────────────────────┘
*/
using Model.Test;
using SQLite;
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace Repository._Base
{
    /// <summary>
    /// SQLite資料操作示例
    /// </summary>
    public class SQLiteDBDemo:SQLiteDBBase
    {
        #region 新增表資料
        /// <summary>
        /// 新增資料
        /// </summary>
        /// <param name="tableTest">資料</param>
        /// <returns></returns>
        public int InsertTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.InsertAsync(tableTest).Result;
        }

        /// <summary>
        /// 新增多條表資料
        /// </summary>
        /// <param name="tableTests">資料</param>
        /// <param name="runInTransaction">是否使用事務</param>
        /// <returns></returns>
        public int InsertTableDatasDemo(List<TableTest> tableTests, bool runInTransaction = true)
        {
            return _SQLiteDBConnection.InsertAllAsync(tableTests, runInTransaction).Result;
        }
        
        #endregion 新增表資料

        #region 刪除表資料
        /// <summary>
        /// 刪除資料
        /// </summary>
        /// <param name="tableTest"></param>
        /// <returns></returns>
        public int DeleteTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.DeleteAsync(tableTest).Result;
        }
        #endregion 刪除表資料

        #region 修改表資料
        /// <summary>
        /// 更新資料
        /// </summary>
        /// <param name="tableTest">資料</param>
        /// <returns></returns>
        public int UpdateTableDataDemo(TableTest tableTest)
        {
            return _SQLiteDBConnection.UpdateAsync(tableTest).Result;
        }

        /// <summary>
        /// 更新所有的表資料
        /// </summary>
        /// <param name="tableTests">資料</param>
        /// <param name="runInTransaction">是否使用事務</param>
        /// <returns></returns>
        public int UpdateAllTableDataDemo(List<TableTest> tableTests,bool runInTransaction = true)
        {
            return _SQLiteDBConnection.UpdateAllAsync(tableTests, runInTransaction).Result;
        }
        #endregion 修改表資料

        #region 查詢表資料
        /// <summary>
        /// 查詢
        /// </summary>
        /// <param name="tableTest">條件</param>
        /// <returns></returns>
        public List<TableTest> QueryTableDataByWhere(TableTest tableTest)
        {
            return _SQLiteDBConnection.QueryAsync<TableTest>("select * from TableTest where Name=? and Pwd=?", tableTest.Name, tableTest.Pwd).Result;
        }

        /// <summary>
        /// 通過Id獲取一條資料
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public TableTest GetTableDataById(int id)
        {
            return _SQLiteDBConnection.QueryAsync<TableTest>("select * from TableTest where Id=?", id).Result.FirstOrDefault();
        }

        /// <summary>
        /// 查詢全部的資料
        /// 返回一個可供查詢的表,後篩選
        /// </summary>
        /// <param name="tableTest">條件</param>
        /// <returns></returns>
        public List<TableTest> GetTableDataByWhere(TableTest tableTest=null)
        {
            if (tableTest !=null)
            {
                return _SQLiteDBConnection.Table<TableTest>().Where(t => t.Name == tableTest.Name).ToListAsync().Result;
            }
            else
            {
                return _SQLiteDBConnection.Table<TableTest>().ToListAsync().Result;
            }
        }
        #endregion 查詢表資料

        #region 事務
        // 執行事務
        public void RunInTransactionAsync()
        {
            // 操作
            TableTest insertObj = new();
            TableTest updateObj = new();
            TableTest deleteObj = new();

             _SQLiteDBConnection.RunInTransactionAsync(tran =>
            {
                // database calls inside the transaction
                tran.Insert(insertObj);
                tran.Update(updateObj);
                tran.Delete(deleteObj);
            });
        }
        #endregion 事務

        #region 建立表
        /// <summary>
        /// 建立表
        /// </summary>
        public void CtreatTableDemo()
        {
            _SQLiteDBConnection.CreateTableAsync<TableTest>();
        }
        #endregion 建立表

        #region 刪除表
        /// <summary>
        /// 刪除表
        /// </summary>
        public void DropTableDemo()
        {
            _SQLiteDBConnection.DropTableAsync<TableTest>();
        }

        #endregion 刪除表

        #region 新增列或修改列、刪除列結構;新增、刪除索引
        /// <summary>
        /// 新增列或修改列結構
        /// </summary>
        public void ModifyColumnsForTableDemo()
        {
            _SQLiteDBConnection.CreateTableAsync<TableTest>();
        }
        #endregion 新增列或修改列、刪除列結構;

        #region 新增、刪除索引(可以用特徵指定)
        /// <summary>
        /// 建立索引
        /// </summary>
        public int CreateIndexAsync()
        {
            TableTest tableTest = new();
            string indexName = "TTName_Index";  // 索引名
            bool unique = false;  // 是否唯一索引

            //return _SQLiteDBConnection.CreateIndexAsync(nameof(TableTest), nameof(tableTest.Name), unique).Result;  // 單個列索引
            return _SQLiteDBConnection.CreateIndexAsync(indexName, nameof(TableTest), nameof(tableTest.Name), unique).Result;  // 單個列索引_指定索引名
            //return _SQLiteDBConnection.CreateIndexAsync(nameof(TableTest),new string[] { nameof(tableTest.Name), nameof(tableTest.Pwd), nameof(tableTest.Description) }, unique).Result;  // 多個列索引
        }

        #endregion 新增、刪除索引(可以用特徵指定)
    }
}