From 7dec9321f6863782609a6f1e37c87289802b2aad Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Thu, 16 Oct 2025 10:00:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96QuestDb=20Insert=20Update=20?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Curd/QuestDbInsert.cs | 25 +++++--- .../Curd/QuestDbUpdate.cs | 58 ++++++++++++------- .../QuestDbGlobalExtensions.cs | 2 +- .../ServiceContainer.cs | 6 +- 4 files changed, 56 insertions(+), 35 deletions(-) diff --git a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsert.cs b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsert.cs index 1087d4a16..c6b52e4cf 100644 --- a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsert.cs +++ b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsert.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using FreeSql.Provider.QuestDb; namespace FreeSql.QuestDb.Curd { @@ -32,11 +33,12 @@ namespace FreeSql.QuestDb.Curd internal void InternalClearData() => ClearData(); internal string InternalTableRuleInvoke() => TableRuleInvoke(); - private int InternelExecuteAffrows() + private int RestApiExecuteAffrows() { //如果设置了RestAPI的Url则走HTTP + var apiFeatures = ServiceContainer.GetService(); var sql = ToSql(); - var execAsync = RestAPIExtension.ExecAsync(sql).GetAwaiter().GetResult(); + var execAsync = apiFeatures.ExecAsync(sql).GetAwaiter().GetResult(); var resultHash = new Hashtable(); try { @@ -49,18 +51,21 @@ namespace FreeSql.QuestDb.Curd throw new Exception("请确认new FreeSqlBuilder().UseQuestDbRestAPI()中设置的用户名密码是否正确."); } } + var ddl = resultHash["ddl"]?.ToString(); return ddl?.ToLower() == "ok" ? 1 : 0; } public override int ExecuteAffrows() { - if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) + var apiFeatures = ServiceContainer.GetService(); + if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress)) { return base.SplitExecuteAffrows(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); } - return InternelExecuteAffrows(); + + return RestApiExecuteAffrows(); } public override long ExecuteIdentity() => base.SplitExecuteIdentity( @@ -170,14 +175,16 @@ namespace FreeSql.QuestDb.Curd #else public override Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default) { - if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) + var apiFeatures = ServiceContainer.GetService(); + if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress)) { return base.SplitExecuteAffrowsAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); } - return Task.FromResult(InternelExecuteAffrows()); + + return Task.FromResult(RestApiExecuteAffrows()); } - + public override Task ExecuteIdentityAsync(CancellationToken cancellationToken = default) => base.SplitExecuteIdentityAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, @@ -187,7 +194,7 @@ namespace FreeSql.QuestDb.Curd base.SplitExecuteInsertedAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); - async protected override Task RawExecuteIdentityAsync(CancellationToken cancellationToken = default) + protected override async Task RawExecuteIdentityAsync(CancellationToken cancellationToken = default) { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -243,7 +250,7 @@ namespace FreeSql.QuestDb.Curd return ret; } - async protected override Task> RawExecuteInsertedAsync(CancellationToken cancellationToken = default) + protected override async Task> RawExecuteInsertedAsync(CancellationToken cancellationToken = default) { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbUpdate.cs b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbUpdate.cs index 3dae955fc..eeff51ce5 100644 --- a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbUpdate.cs +++ b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbUpdate.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using FreeSql.Provider.QuestDb; namespace FreeSql.QuestDb.Curd { @@ -31,10 +32,11 @@ namespace FreeSql.QuestDb.Curd internal void InternalToSqlCaseWhenEnd(StringBuilder sb, ColumnInfo col) => ToSqlCaseWhenEnd(sb, col); - private int InternelExecuteAffrows() + private int RestApiExecuteAffrows() { + var apiFeatures = ServiceContainer.GetService(); var sql = ToSql(); - var execAsync = RestAPIExtension.ExecAsync(sql).GetAwaiter().GetResult(); + var execAsync = apiFeatures.ExecAsync(sql).GetAwaiter().GetResult(); var resultHash = new Hashtable(); try { @@ -47,6 +49,7 @@ namespace FreeSql.QuestDb.Curd throw new Exception("请确认new FreeSqlBuilder().UseQuestDbRestAPI()中设置的用户名密码是否正确."); } } + var ddl = resultHash["ddl"]?.ToString(); var updated = Convert.ToInt32(resultHash["updated"]); return ddl?.ToLower() == "ok" ? updated : 0; @@ -54,19 +57,23 @@ namespace FreeSql.QuestDb.Curd public override int ExecuteAffrows() { - //如果设置了RestAPI中Url则走HTTP - if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) + //如果设置了RestApi 则走HTTP执行Sql + var apiFeatures = ServiceContainer.GetService(); + if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress)) { return base.SplitExecuteAffrows(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); } - return InternelExecuteAffrows(); + + return RestApiExecuteAffrows(); } - protected override List ExecuteUpdated(IEnumerable columns) => base.SplitExecuteUpdated(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns); + protected override List ExecuteUpdated(IEnumerable columns) => + base.SplitExecuteUpdated(_batchRowsLimit > 0 ? _batchRowsLimit : 500, + _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns); - protected override List RawExecuteUpdated(IEnumerable columns) - { + protected override List RawExecuteUpdated(IEnumerable columns) + { var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; @@ -94,10 +101,11 @@ namespace FreeSql.QuestDb.Curd Exception exception = null; try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + { + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, + _commandTimeout, dbParms); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) @@ -178,20 +186,25 @@ namespace FreeSql.QuestDb.Curd #else public override Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default) { - if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) + var apiFeatures = ServiceContainer.GetService(); + if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress)) { return base.SplitExecuteAffrowsAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); } - - return Task.FromResult(InternelExecuteAffrows()); + + return Task.FromResult(RestApiExecuteAffrows()); } - protected override Task> ExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) => base.SplitExecuteUpdatedAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns, cancellationToken); + protected override Task> ExecuteUpdatedAsync(IEnumerable columns, + CancellationToken cancellationToken = default) => base.SplitExecuteUpdatedAsync( + _batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, + columns, cancellationToken); - async protected override Task> RawExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) - { + protected override async Task> RawExecuteUpdatedAsync(IEnumerable columns, + CancellationToken cancellationToken = default) + { var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; @@ -219,10 +232,11 @@ namespace FreeSql.QuestDb.Curd Exception exception = null; try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + { + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, + CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbGlobalExtensions.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbGlobalExtensions.cs index 4d0a20efe..aff85f716 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbGlobalExtensions.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbGlobalExtensions.cs @@ -351,7 +351,7 @@ static class LatestOnExtension } } -class QuestResetApiFeatures +internal class QuestResetApiFeatures { internal string BaseAddress { get; set; } diff --git a/Providers/FreeSql.Provider.QuestDb/ServiceContainer.cs b/Providers/FreeSql.Provider.QuestDb/ServiceContainer.cs index 31049dcf3..628dd7faf 100644 --- a/Providers/FreeSql.Provider.QuestDb/ServiceContainer.cs +++ b/Providers/FreeSql.Provider.QuestDb/ServiceContainer.cs @@ -9,18 +9,18 @@ namespace FreeSql.Provider.QuestDb internal class ServiceContainer { private static IServiceCollection _services; - internal static IServiceProvider ServiceProvider { get; private set; } + private static IServiceProvider _serviceProvider; internal static void Initialize(Action service) { _services = new ServiceCollection(); service?.Invoke(_services); - ServiceProvider = _services.BuildServiceProvider(); + _serviceProvider = _services.BuildServiceProvider(); } internal static T GetService() { - return ServiceProvider.GetService(); + return _serviceProvider == null ? default : _serviceProvider.GetService(); } } } \ No newline at end of file