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

C# SQLiteDataAdapter填充DataTable列名与查询不符问题咨询

问题明确诱因

这个问题属于SQLite及ADO.NET驱动的已知行为+代码冗余共同导致,仅在特定库复现的原因非常明确:

  • SQLite本身对标识符(列名、表名)默认大小写不敏感,但查询返回的结果集列名默认使用表创建时定义的原始列名字符串(保留原始大小写),和你SELECT语句中书写的列名大小写无关。你遇到的列名从C_ChatRoomId变成C_ChatRoomID,本质是这个出问题的数据库在创建ChatroomInfoTable时,C_ChatRoomID列的最后一个D就是大写的;其他同结构数据库建表时列名写的是小写d,所以返回的列名和你SQL里写的一致,不会触发问题。
  • 返回0条记录的问题来自两个触发点:
    1. 你传入的是按引用传递的DataTable,如果调用方法前这个DataTable已经残留了之前查询的结构(比如已经存在小写d的C_ChatRoomId列),旧版本System.Data.SQLite驱动在列名仅存在大小写差异时,会出现列映射失败,不会把读取到的数据写入对应列,最终返回0行。
    2. 你在纯查询场景下多余使用了SQLiteCommandBuilder,这个组件的作用是为DataAdapter自动生成增删改SQL语句,本身会在初始化时额外拉取一次数据表的完整schema,部分版本下会干扰Fill操作的列映射逻辑。
修复方案

按优先级操作即可解决:

  1. 移除查询逻辑中完全冗余的SQLiteCommandBuilder代码块,纯查询填充DataTable不需要这个组件,删掉即可避免它对schema映射的干扰。
  2. 每次Fill操作前,显式清空传入DataTable的残留结构和数据,避免历史schema干扰:
    table.Clear();
    table.Columns.Clear(); // 如果你需要保留现有表结构就跳过这行
    
  3. 显式指定DataAdapter的缺失结构处理规则,避免默认行为在不同驱动版本下的差异:
    adapter.MissingSchemaAction = MissingSchemaAction.Add;
    
  4. 如果你需要强制结果集列名和你SQL中书写的大小写完全一致,直接在SELECT语句中给列加显式别名即可,加别名后SQLite会优先使用你指定的别名作为结果集列名,不会返回建表时的原始列名:
    SELECT C_ChatRoomId AS C_ChatRoomId FROM ChatroomInfoTable
    
  5. 如果你需要保留DataTable的现有结构不清空,显式设置DataTable的列名匹配规则为大小写不敏感:
    table.CaseSensitive = false;
    
  6. 如果你使用的System.Data.SQLite驱动版本低于1.0.110,直接升级到最新稳定版即可,旧版本存在列名大小写映射的已知bug,会在列名仅大小写不同时出现填充0行的问题。

验证方式:可以直接用SQLiteDataReader读取问题库的查询结果,调用reader.GetName(0)就能看到返回的原始列名确实是大写D的C_ChatRoomID,即可确认根因判断。

内容的提问来源于stack exchange,提问作者LejCat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:39:28