You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sqflite插入数据时触发SQL语法错误异常求助

问题分析与解决办法

错误原因

从报错信息和代码来看,SQL语法错误的核心原因有两个:

  • 字符串值未加引号:logo字段的值the logo、business_name字段的阿拉伯语名称都是字符串类型,直接拼入SQL语句时没有用单引号包裹,SQL解析器会把它们当成标识符(比如关键字、字段名),从而抛出语法错误。
  • 错误的变量引用:代码中${'business_tax_vat_id'}是直接插入字符串"business_tax_vat_id"到SQL中,而非引用json对象里的对应值;即使这是你想插入的固定字符串,同样需要加单引号,否则也会触发语法错误。

另外,直接通过字符串拼接生成SQL语句不仅容易出现格式问题,还存在SQL注入的安全风险,这是不推荐的写法。

解决办法

推荐使用sqflite提供的参数化查询方式,用?作为占位符,将参数单独传入,sqflite会自动处理字符串引号、转义等问题,同时避免SQL注入。

修改后的代码示例1(使用rawInsert参数化)

await database.rawInsert('''
    INSERT INTO Preferences (co_id, default_br_id, default_wh_id, logo, business_name, business_tax_vat_id, last_sales_invoice_id, last_sales_return_invoice_id, last_purchase_invoice_id, last_purchase_return_invoice_id, last_sales_quotation_id)
    VALUES (?, ?, ?, ?, ?, ?, null, null, null, null, null)
''', [
  json['co_id'],
  json['default_br_id'],
  json['default_wh_id'],
  json['logo'],
  json['business_name'],
  json['business_tax_vat_id'], // 这里改为正确引用json中的值
]);

修改后的代码示例2(使用更简洁的insert方法)

sqflite的insert方法可以直接传入字段映射,无需手写SQL语句,更不易出错:

await database.insert(
  'Preferences',
  {
    'co_id': json['co_id'],
    'default_br_id': json['default_br_id'],
    'default_wh_id': json['default_wh_id'],
    'logo': json['logo'],
    'business_name': json['business_name'],
    'business_tax_vat_id': json['business_tax_vat_id'],
    'last_sales_invoice_id': null,
    'last_sales_return_invoice_id': null,
    'last_purchase_invoice_id': null,
    'last_purchase_return_invoice_id': null,
    'last_sales_quotation_id': null,
  },
);

验证说明

使用参数化查询后,sqflite会自动为字符串类型的值添加单引号,处理特殊字符转义,生成合法的SQL语句,解决当前的语法错误问题。

内容的提问来源于stack exchange,提问作者Haya Hesham Abdel-azim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:36:09