DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.27k stars 1.33k forks source link

Oracle環境下幾個BUG: BulkCopyTimeout失效、分頁查詢語法錯誤 #1120

Closed Yumitoya8569 closed 1 year ago

Yumitoya8569 commented 1 year ago

環境

.Net 7 Oracle 11g SqlSugarCore 5.1.3.43

問題

  1. BulkCopy Timeout 設定失效 查看其他庫一般會在GetBulkCopyInstance裡進行設置, Oracle的BulkCopyTimeout目前全局搜尋不到 BulkCopyTimeout

  2. 當Orderby + Distinct + ToPageList 一起使用時會出現語法錯誤 Oracle不支援TOP關鍵字 SelectDistinctPage

  3. Oracle ToPageList 在以下這個條件會發生語法錯誤

    await _db.Queryable<TableA>().ToPageListAsync(1, 50); // 正常工作
    await _db.Queryable<TableA>().Select(a => a).ToPageListAsync(1, 50); // 報錯

    產出錯誤語法如下, 這個情況下Oracle子查詢不支援 SELECT *

    SELECT * FROM (SELECT *, ROW_NUMBER() OVER( ORDER BY sysdate ) AS RowIndex FROM "TableA" ) T WHERE RowIndex BETWEEN 1 AND 50
DotNetNext commented 1 year ago

你可以用这个分支单表的* .ToOffsetPage(1,2)

DotNetNext commented 1 year ago

bulkcopy设置时间问题已修复 默认300 可以通过db.ado.timeout修改 image

DotNetNext commented 1 year ago

源码修复过了,NUGET后面会发布

Yumitoya8569 commented 1 year ago

謝謝您 不過ToOffsetPage是否會有相容性的問題? 印象中Oracle要到12c才支援Offset

我目前是這樣處理:

var pageQuery = /* 分頁語法 */

var builder = pageQuery.QueryBuilder;
builder.Take = pageSize;
builder.Skip = pageSize * (pageIndex-1);
var sql = builder.ToSqlString().Replace("TOP 2147483647", "");

var result = await db.Ado.SqlQueryAsync<DtoA>(sql, builder.Parameters);

不過考慮到其他人維護可能搞不清楚狀況, 還是希望能從源碼解決

DotNetNext commented 1 year ago

只是名字叫offfset并不是真的offset分页

DotNetNext commented 1 year ago

没有兼容问题

Yumitoya8569 commented 1 year ago

謝謝, ToOffsetPage經實測在Oracle 11g運作良好, 已全面改用

DotNetNext commented 1 year ago

最新预览版本已发布 5.1.3.46-preview03 修复了bulkcopy设置timeout (默认300)

通过db.ado.Timeout=xxx