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

C#连接MS Access 2003多表INNER JOIN出现语法错误求助

解决MS Access 2003多表JOIN的语法错误问题

你遇到的这个错误,是MS Access 2003使用的Jet SQL引擎特有的语法限制导致的——Access Jet SQL要求多个连续的INNER JOIN必须用括号嵌套,不像标准SQL(比如SQL Server)可以直接连续写连接语句。你的原SQL没有做嵌套处理,引擎无法正确解析连接的逻辑层级,所以抛出了语法错误。

修正后的SQL语句

把多表JOIN部分用括号逐层嵌套,让Access能识别正确的连接顺序:

SELECT k.[Desc], k.Family, k.Num, p1.Name AS KeyAdmin, 
       p2.Name AS KeyCustodian1, p3.Name AS KeyCustodian3,
       p4.Name AS SecurityOfficer, p5.Name AS ServiceIT 
FROM (((((KC AS k 
INNER JOIN Person AS p1 ON k.Ka = p1.Id) 
INNER JOIN Person AS p2 ON k.Kc1 = p2.Id) 
INNER JOIN Person AS p3 ON k.Kc3 = p3.Id) 
INNER JOIN Person AS p4 ON k.So = p4.Id) 
INNER JOIN Person AS p5 ON k.It = p5.Id) 
WHERE k.Num = @Num;

完整的修正后C#代码

替换你原代码中的SQL字符串即可,另外注意using块会自动管理连接生命周期,不需要手动调用conn.Close():

try 
{ 
    using (OleDbConnection conn = new OleDbConnection(connecString)) 
    { 
        conn.Open(); 
        OleDbCommand cmd = new OleDbCommand(@"SELECT k.[Desc], k.Family, k.Num, p1.Name AS KeyAdmin, 
                                                   p2.Name AS KeyCustodian1, p3.Name AS KeyCustodian3,
                                                   p4.Name AS SecurityOfficer, p5.Name AS ServiceIT 
                                            FROM (((((KC AS k 
                                            INNER JOIN Person AS p1 ON k.Ka = p1.Id) 
                                            INNER JOIN Person AS p2 ON k.Kc1 = p2.Id) 
                                            INNER JOIN Person AS p3 ON k.Kc3 = p3.Id) 
                                            INNER JOIN Person AS p4 ON k.So = p4.Id) 
                                            INNER JOIN Person AS p5 ON k.It = p5.Id) 
                                            WHERE k.Num = @Num;", conn); 
        OleDbDataAdapter adapt = new OleDbDataAdapter(cmd); 
        cmd.Parameters.AddWithValue("@num", form.comboKC.SelectedValue); 
        DataTable dt = new DataTable(); 
        adapt.Fill(dt); 
        form.dataGridView1.DataSource = dt; 
    }
}
catch (Exception ex)
{
    // 建议添加异常捕获,方便调试时查看具体错误信息
    MessageBox.Show("运行错误:" + ex.Message);
}

调试小技巧

以后遇到Access SQL语法问题,可以先把SQL语句复制到Access的查询设计器里直接运行,Access会给出更直观的语法错误提示,能帮你快速定位问题,比在代码里调试更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:04:11