国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.Net core下直接執行SQL語句并生成DataTable的實現方法

2024-07-10 12:49:34
字體:
來源:轉載
供稿:網友

.net core可以執行SQL語句,但是只能生成強類型的返回結果。例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs").ToList()。而不允許返回DataSet、DataTable等弱類型。可能由于這個原因沒有實現在.net core中DataTable,然而DataTable還是可能會用到的。我們這里就有一個數據倉庫的需求,允許用戶自行編寫類似SQL語句,然后執行,以表格展示。因為語句是千變萬化的,因此我也不知道用戶的語句輸出的是啥,更無法以類型來定義,因此只能采用DataTable方式。

之前.net framework下,可以通過dataadpater很方便的填充datatable,然后將datatable的數據推送到客戶端展示。但是.net core下,已經沒有DataTable和DataSet,我們只能自行實現MicroDataTable。

這里我們也按照DataTable的方式,MicroDataTable的列定義為MicroDataColumn,行定義為MicroDataRow。代碼如下:

public class MicroDataTable{ /// <summary>/// 整個查詢語句結果的總條數,而非本DataTable的條數/// </summary>public int TotalCount { get; set; }public List<MicroDataColumn> Columns { get; set; } = new List<MicroDataColumn>();public List<MicroDataRow> Rows { get; set; } = new List<MicroDataRow>();public MicroDataColumn[] PrimaryKey { get; set; }public MicroDataRow NewRow(){return new MicroDataRow(this.Columns, new object[Columns.Count]);}}public class MicroDataColumn{public string ColumnName { get; set; }public Type ColumnType { get; set; }}public class MicroDataRow{private object[] _ItemArray;public List<MicroDataColumn> Columns { get; private set; }public MicroDataRow(List<MicroDataColumn> columns, object[] itemArray){this.Columns = columns;this._ItemArray = itemArray;}public object this[int index]{get { return _ItemArray[index]; }set { _ItemArray[index] = value; }}public object this[string columnName]{get{int i = 0;foreach (MicroDataColumn column in Columns){if (column.ColumnName == columnName)break;i++;}return _ItemArray[i];}set{int i = 0;foreach (MicroDataColumn column in Columns){if (column.ColumnName == columnName)break;i++;}_ItemArray[i] = value;}}}

需要注意的是TotalCount屬性,在分頁情況下,是指查詢語句在數據庫中查詢出的所有記錄條數,而MicroDataTable的數據是當前頁面的記錄。

對于從數據庫中獲取DataTable的做法,采用類似SqlHelper的方式編寫DbContext的ExecuteDataTable擴展方法,傳入SQL語句和SQL語句的參數,生成MicroDataTable:

public static MicroDataTable ExecuteDataTable(this DbContext context, string sql, params object[] parameters){var concurrencyDetector = context.Database.GetService<IConcurrencyDetector>();using (concurrencyDetector.EnterCriticalSection()){var rawSqlCommand = context.Database.GetService<IRawSqlCommandBuilder>().Build(sql, parameters);RelationalDataReader query = rawSqlCommand.RelationalCommand.ExecuteReader(context.Database.GetService<IRelationalConnection>(), parameterValues: rawSqlCommand.ParameterValues);return MicroDataTableHelper.FillDataTable(query.DbDataReader, 0, int.MaxValue);}}public static MicroDataTable ExecuteDataTable(this DbContext context, string sql, int pageIndex, int pageSize, params object[] parameters){var concurrencyDetector = context.Database.GetService<IConcurrencyDetector>();using (concurrencyDetector.EnterCriticalSection()){var rawSqlCommand = context.Database.GetService<IRawSqlCommandBuilder>().Build(sql, parameters);RelationalDataReader query = rawSqlCommand.RelationalCommand.ExecuteReader(context.Database.GetService<IRelationalConnection>(), parameterValues: rawSqlCommand.ParameterValues);return MicroDataTableHelper.FillDataTable(query.DbDataReader, 0, int.MaxValue);}}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏东市| 邵武市| 武安市| 娄底市| 湟源县| 苏州市| 监利县| 海林市| 贡嘎县| 井冈山市| 南投县| 荣昌县| 灌南县| 田东县| 江都市| 铜山县| 尉犁县| 略阳县| 海晏县| 汶上县| 扬中市| 琼结县| 多伦县| 弋阳县| 绥化市| 安龙县| 买车| 沁阳市| 榆中县| 小金县| 永清县| 贞丰县| 金沙县| 贡山| 那曲县| 金山区| 翼城县| 卢氏县| 云阳县| 湘西| 砀山县|