使用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
相关产品推荐
相关产品推荐

