5.9K Star 11.6K Fork 4K

GVPdotNET China / Furion

 / 详情

JobHttp请求生成的sql语句语法错误

已完成
创建于  
2023-03-17 13:19

输入图片说明

💢 特别说明:如果 Issue 没有严格按照模板编写且未提供测试源码下载或 Git 测试仓库地址,则视为无效 Issue,将无法得到答复。

Furion 版本号

4.8.7.13


.NET SDK 版本号

  • .NET5
  • .NET6
  • .NET7

项目类型

  • WebApi
  • Mvc
  • Razor Pages
  • Blazor Server
  • MinApp
  • WinForm
  • WPF
  • Console

操作系统和版本

  • Windows(版本号?)
  • Linux(版本号?)
  • MacOS(版本号?)
  • 其他(版本号?)

代码环境

  • 开发环境(Development)
  • 生产环境(Production)
  • 测试环境(Tests/单元测试/集成测试 )

描述你的问题

如果jobhttp请求的是个html网页,会因为返回的内容有特殊字符导致sql语句,语法错误,无法插入数据库
输入图片说明
生成的sql语句(result部分删除了一些,内容太多)

UPDATE JobTrigger
SET
    triggerId = N'myti',
    jobId = N'myjob2222',
    triggerType = N'Furion.Schedule.PeriodTrigger',
    assemblyName = N'Furion',
    args = N'[5000]',
    description = NULL,
    status = 1,
    startTime = NULL,
    endTime = NULL,
    lastRunTime = N'2023-03-17 13:14:38.440',
    nextRunTime = N'2023-03-17 13:14:43.449',
    numberOfRuns = 4,
    maxNumberOfRuns = 0,
    numberOfErrors = 0,
    maxNumberOfErrors = 0,
    numRetries = 0,
    retryTimeout = 1000,
    startNow = 1,
    runOnStart = 0,
    resetOnlyOnce = 1,
    result = N'{"StatusCode":200,"Body":"<!DOCTYPE html><html><head>\n      <title>dotNET China | 让 .NET 开发更简单,更通用,更流行</title>\n      <meta charset=\"utf-8\">\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n      \n      <link rel=\"stylesheet\" href=\"file:///c:\\Users\\snrcsoft\\.vscode\\extensions\\shd101wyy.markdown-preview-enhanced-0.6.1\\node_modules\\@shd101wyy\\mume\\dependencies\\katex\\katex.min.css\">\n      \n      \n      \n      \n      \n      \n   &#x793E;&#x533A;&#x8FD0;&#x8425;&#x652F;&#x51FA;&#x3002;</p>\n<p><strong><a href=\"https://gitee.com/dotnetchina/home/blob/master/0;&#x5165;&#x9879;&#x76EE;&#x5217;&#x5165;&#x5236;&#x88C1;&#x9ED1;&#x540D;&#x5355;&#x5E76;&#x6C38;&#x4E0D;&#x518D;&#x63A5;&#x7EB3;&#x3002;</p>\n<p><strong>&#x514D;&#x8D23;&#x7533;&#x660E;&#xFF1A;dotNET China &#x6240;&#x5B75;&#x5316;&#x9879;&#x76EE;&#x7684;&#x4E00;&#x5207;&#x8FDD;&#x6CD5;&#x884C;&#x4E3A;&#x7686;&#x548C; dotNET China &#x7EC4;&#x7EC7;&#x65E0;&#x5173;&#x3002;</strong></p>\n\n      </div>\n      \n      \n    \n    \n    \n    \n    \n    \n    \n    \n  \n    </body></html>"}',
    elapsedTime = 1161,
    updatedTime = N'2023-03-17 13:14:39.656'
WHERE triggerId = N'myti' AND jobId = N'myjob2222';

异常堆栈信息

Microsoft.Data.SqlClient.SqlException
HResult=0x80131904
Message='s' 附近有语法错误。
不能在 WHILE 语句的作用域之外使用 BREAK 语句。
标签 'size' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'size' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'hyphens' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'hyphens' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'hyphens' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'shadow' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'sizing' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'overflow' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'color' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'width' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'radius' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'color' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'radius' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'color' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'border' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'clip' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'decoration' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'padding' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'bottom' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'type' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'width' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'padding' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'margin' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'sizing' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'width' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'padding' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'width' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'width' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'display' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'https' 已声明。标签名称在查询批次或存储过程内部必须唯一。
以 'https://gitee.com/dotnetchina/home/raw/master/%E6%AF%8F%E6%9C%9F%E7%B2%BE%E9%80%89%E9%A1%B9%E7%9B%AE/playbills/BootstrapBlazor.p' 开头的 标识符 太长。最大长度为 128。
以 'https://gitee.com/dotnetchina/home/raw/master/%E6%AF%8F%E6%9C%9F%E7%B2%BE%E9%80%89%E9%A1%B9%E7%9B%AE/playbills/BootstrapAdmin.pn' 开头的 标识符 太长。最大长度为 128。
以 'https://gitee.com/dotnetchina/home/raw/master/%E6%AF%8F%E6%9C%9F%E7%B2%BE%E9%80%89%E9%A1%B9%E7%9B%AE/playbills/sharding-core.png' 开头的 标识符 太长。最大长度为 128。
标签 'https' 已声明。标签名称在查询批次或存储过程内部必须唯一。
标签 'https' 已声明。标签名称在查询批次或存储过程内部必须唯一。
以 'https://gitee.com/dotnetchina/home/raw/master/MIP%20%E4%B8%93%E5%AE%B6%E5%90%8D%E5%BD%95/%E5%AF%8C%E5%AF%9F%E5%AE%8F%E7%A3%8A%20' 开头的 标识符 太长。最大长度为 128。
以 'https://gitee.com/dotnetchina/home/raw/master/MIP%20%E4%B8%93%E5%AE%B6%E5%90%8D%E5%BD%95/%E8%8B%A5%E6%B1%9D%E6%A3%8B%E8%8C%97%20' 开头的 标识符 太长。最大长度为 128。
字符串 '}',
elapsedTime = 1112,
updatedTime = N'2023-03-17 14:00:57.076'
WHERE triggerId = N'myti' AND jobId = N'myjob2222';' 后的引号不完整。
Source=Core Microsoft SqlClient Data Provider
StackTrace:
在 SqlSugar.AdoProvider.ExecuteCommand(String sql, SugarParameter[] parameters)
在 Lampon.Core.DbJobPersistence.OnTriggerChanged(PersistenceTriggerContext context) 在 D:\MyFiles\PartTime\Lampon\Lampon.WebApi\Lampon.Core\DbJobPersistence.cs 中: 第 176 行
在 Furion.Schedule.SchedulerFactory.ProcessQueue()


测试项目代码

⚠⚠ 必须提供完整可运行且包含错误的 Git 仓库 DEMO,DEMO 提供最简单的错误逻辑代码,否则将无法得到答复。⚠⚠

 /// <summary>
    /// 作业持久化(数据库)
    /// </summary>
    public class DbJobPersistence : IJobPersistence, IDisposable
    {
        private readonly IServiceScope _serviceScope;
        private readonly ISqlSugarClient _sqlSugarClient;
        private readonly Repository<Entities.JobDetail> _jobRepository;
        private readonly Repository<Entities.JobTrigger> _triggerRepository;

        public DbJobPersistence(IServiceScopeFactory scopeFactory)
        {
            _serviceScope = scopeFactory.CreateScope();
            var services = _serviceScope.ServiceProvider;

            _sqlSugarClient = services.GetService<ISqlSugarClient>();
            _jobRepository = services.GetService<Repository<Entities.JobDetail>>();
            _triggerRepository = services.GetService<Repository<Entities.JobTrigger>>();
        }

        /// <summary>
        /// 作业调度服务启动时
        /// </summary>
        /// <returns></returns>
        public IEnumerable<SchedulerBuilder> Preload()
        {
        
            List<SchedulerBuilder> allJobs = new List<SchedulerBuilder>();
            var list = _jobRepository.GetList();
            foreach (var job in list)
            {
            
                var trigger = _triggerRepository.GetList(a => a.JobId == job.JobId);
                
                var data = new Jobs.JobBuilder() { jobDetail=job,triggers=trigger};
             
                var jobBuilder = JSON.Serialize(data);
                var schedulerBuilder = SchedulerBuilder.From(jobBuilder);
                foreach (var (_, triggerBuilder) in schedulerBuilder.GetEnumerable())
                {
                    triggerBuilder.Updated();   // 标记触发器更新
                }
                schedulerBuilder.Updated();//标记作业更新
                allJobs.AddRange(schedulerBuilder);

            }
            return allJobs;
        }

        // ...

        public void Dispose()
        {
            _serviceScope?.Dispose();
        }

        public SchedulerBuilder OnLoading(SchedulerBuilder builder)
        {
          
            return builder;

        }
        public void OnChanged(PersistenceContext context)
        {

            var sql = context.ConvertToSQL("JobDetail");

            _jobRepository.Context.Ado.ExecuteCommand(sql);

        }

        public void OnTriggerChanged(PersistenceTriggerContext context)
        {
            // 输出 CamelCase(驼峰命名法)SQL 语句,默认值
            var sql = context.ConvertToSQL("JobTrigger");
       
    
            _jobRepository.Context.Ado.ExecuteCommand(sql);
          
        }

数据库信息和版本

请提供安装的 NuGet 包版本号。

  • Sqlite(包名和版本号?)
  • SqlServer(包名和版本号?)
  • MySQL(包名和版本号?)
  • Oracle(包名和版本号?)
  • PostgreSQL(包名和版本号?)
  • Firebird(包名和版本号?)
  • Cosmos(包名和版本号?)
  • InMemoryDatabase(包名和版本号?)

期待结果

生成能执行的sql语句


确认工单

为了减少不必要的沟通成本和时间成本,请再次确认 Issue 已按照要求正确填写,否则将被直接关闭。

评论 (7)

lampon 创建了任务

这两年我一直在思考一个问题,究竟是同是中国人拉近了距离,还是从本性就是不懂得尊重人?究竟是什么样的原因导致一个个眼瞎了看不到 Issue 模板的提示,一而再再而三的无视 Issue 一条条加粗的提示和警示。

是本人太好说话让大家理所当然的觉得一切都是那么理所当然?就这么一个小小的按照模板发 Issue 的事,竟然 99%的人都做不到,而且是说了再犯,一次次的忽视?

我都不敢提这样的要求,不过有些东西是要规范起来,挺大佬!

百小僧 任务状态待办的 修改为已完成

抱歉.. 第一次在上面提交问题,因为默认markdown源码显示,看起来不舒服,没细看内容,全删了提交的问题。已经按照要求修改了,看看可否?下次一定认真提交。开源不易,支持!!!

:+1: :+1: 第一次遇到这么高效的开源项目

收到,多换位思考一下,你们一个个只写一个标题,Furion 发布了几百个版本,适配十几种应用类型,不同的数据库,不同的环境,请问一个标题,一张图全部让我猜吗?

提供详细的复现步骤或者demo,可以让问题解决时间控制在分钟级,不然都是小时单位,一天还能做其他事吗?


这个问题已修正:60e0a4b

替换 .Replace("'", "''") 即可。

下个版本(今天)发布。

lampon 修改了描述
lampon 修改了描述

Furion v4.8.7.15 版本发布,已修正

测试看看,如果还有问题,继续反馈。

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
974299 monksoul 1578937227 1102362 bryan31 1578940308 457976 lampon 1602472781
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助