C#中SQL JOIN绑定DataGridView报错:无法创建字段子列表
解决C#中JOIN查询绑定DataGridView的报错问题
你遇到的问题根源其实很清晰:你把完整的SQL查询字符串直接当成了DataTable的名称和DataMember值,当DataGridView尝试解析这个超长的"表名"时,错误地把SQL语句的开头部分识别成了字段名,这才抛出了那个奇怪的报错。
错误原因拆解
看你代码里的这几行:
ds.Tables.Add(sqlGrid1); adapter.Fill(ds, sqlGrid1); dataGridView1.DataMember = sqlGrid1;
这里的sqlGrid1是一整串SQL查询语句,当你把它传给Fill方法的第二个参数时,DataSet里生成的表名就变成了这个超长的字符串。之后把它赋值给DataMember,DataGridView会尝试解析这个字符串,误把select ACCOUNT, n当成了某个字段名来处理,自然会触发"无法创建子列表"的错误。
修正后的完整代码
我们只需要给DataTable指定一个简洁合法的表名,比如"NotesAccount",然后统一用这个名称来操作即可:
string sqlGrid1 = @" SELECT a.ACCOUNT, n.AccountKey, n.NoteKey, n.Notes FROM tNotes AS n JOIN tAccount AS a ON n.Accountkey = a.Accountkey WHERE TransDate = '2/28/2018'"; // 推荐用using语句自动管理连接资源,避免连接泄漏 using (SqlConnection conn = new SqlConnection([connection string])) { SqlDataAdapter adapter = new SqlDataAdapter(sqlGrid1, conn); DataSet ds = new DataSet(); // 给表指定一个简洁的名称 string tableName = "NotesAccount"; // Fill方法会自动在DataSet中创建对应表,无需提前添加 adapter.Fill(ds, tableName); dataGridView1.DataSource = ds; dataGridView1.DataMember = tableName; // 设置列可见性 dataGridView1.Columns[0].Visible = true; dataGridView1.Columns[1].Visible = false; dataGridView1.Columns[2].Visible = false; dataGridView1.Columns[3].Visible = true; }
额外优化建议
- 改用参数化查询:你当前的SQL直接硬编码了日期值,既容易引发SQL注入风险,也可能出现日期格式兼容问题,改成参数化查询更安全可靠:
string sqlGrid1 = @" SELECT a.ACCOUNT, n.AccountKey, n.NoteKey, n.Notes FROM tNotes AS n JOIN tAccount AS a ON n.Accountkey = a.Accountkey WHERE TransDate = @TransDate"; // 添加参数 adapter.SelectCommand.Parameters.AddWithValue("@TransDate", new DateTime(2018, 2, 28));
- 移除多余的表添加操作:
adapter.Fill(ds, tableName)会自动在DataSet中创建对应的DataTable,之前的ds.Tables.Add(sqlGrid1)完全是多余的,可以直接删掉。
这样修改后,你的JOIN查询就能正常绑定到DataGridView了,完全不需要创建冗余的数据库视图。
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

