在VB.NET中通过查询记录从DataTable读取数据
查询无类型Dataset中DataTable的简便方法
核心实现思路
- 优先通过
Skillname查询:利用LINQ to DataSet直接匹配字符串,无需手动处理空格、引号等特殊字符,避免查询语法错误。 - 若
Skillname未匹配到结果,再通过主键Skill_ID查询(主键查询效率更高且无特殊字符问题)。 - 提取结果时使用
Field<T>方法安全转换列值到对应类型,确保类型匹配。
代码示例(C#)
方法1:推荐使用LINQ to DataSet(简洁安全)
// 定义要查询的目标值 string targetSkillName = "你的技能名称(含空格/引号/连字符)"; int targetSkillId = 123; // 备用查询的Skill_ID // 获取目标DataTable DataTable skillTable = ds_Databank_Skills.Tables["dtab_Skills_Summary"]; // 优先按Skillname查询 DataRow skillRow = skillTable.AsEnumerable() .FirstOrDefault(row => row.Field<string>("Skillname") == targetSkillName); // 未找到则按Skill_ID查询 if (skillRow == null) { skillRow = skillTable.AsEnumerable() .FirstOrDefault(row => row.Field<int>("Skill_ID") == targetSkillId); } // 提取数据到对应类型变量 if (skillRow != null) { int skillId = skillRow.Field<int>("Skill_ID"); string skillName = skillRow.Field<string>("Skillname"); bool lus = skillRow.Field<bool>("Lus"); bool expert = skillRow.Field<bool>("Expert"); string categorie = skillRow.Field<string>("Categorie"); string attribut = skillRow.Field<string>("Attribut"); short epCost = skillRow.Field<short>("EP_Cost"); short maxLevel = skillRow.Field<short>("Max_Level"); string description = skillRow.Field<string>("Description"); // 此处可使用上述变量进行后续业务逻辑处理 } else { // 处理未查询到数据的场景 Console.WriteLine("未找到匹配的技能数据"); }
方法2:使用DataTable.Select方法(需处理特殊字符)
如果偏好传统的Select语法,需要手动转义特殊字符(比如单引号替换为两个单引号):
string targetSkillName = "带'引号的技能名称"; int targetSkillId = 123; DataTable skillTable = ds_Databank_Skills.Tables["dtab_Skills_Summary"]; // 转义Skillname中的单引号 string escapedSkillName = targetSkillName.Replace("'", "''"); DataRow[] matchedRows = skillTable.Select($"Skillname = '{escapedSkillName}'"); DataRow skillRow = matchedRows.FirstOrDefault(); // 未找到则按Skill_ID查询 if (skillRow == null) { matchedRows = skillTable.Select($"Skill_ID = {targetSkillId}"); skillRow = matchedRows.FirstOrDefault(); } // 提取变量的逻辑同方法1 if (skillRow != null) { // 转换类型并赋值 }
关键说明
AsEnumerable():将DataTable转换为可枚举的DataRow集合,支持LINQ查询。Field<T>():安全地将列值转换为指定类型,自动处理DBNull(若列可能为空,可使用可空类型,如Field<bool?>("Lus"))。- 优先使用LINQ方式:无需手动处理特殊字符,代码可读性更高,类型安全性更强。
内容的提问来源于stack exchange,提问作者Arashya
相关产品推荐
相关产品推荐

