查询在Access中运行但不在C#中运行

时间:2014-04-30 09:29:37

标签: c# sql ms-access

我有以下Access查询:

select [Module.ID], [Module.mname], [ModuleMarks.Mark] 
FROM (Student LEFT OUTER JOIN   ModuleMarks ON Student.ID = ModuleMarks.StudentId) 
LEFT OUTER JOIN Module ON ModuleMarks.ModuleId = Module.ID where Student.ID = 1;

这在Access中运行没有问题。

但是,使用以下代码通过C#运行相同的查询:

OleDbConnection dbCon = new OleDbConnection(Properties.Resources.connectionString);
dbCon.Open();
string sqlStudentMarks = "select [Module.ID], [Module.mname], [ModuleMarks.Mark] " +
            "FROM (Student LEFT OUTER JOIN ModuleMarks ON Student.ID =
            ModuleMarks.StudentId) LEFT OUTER JOIN Module ON ModuleMarks.ModuleId =
             Module.ID " + "where Student.ID = " + studentId.ToString() + ";";
Debug.WriteLine(sqlStudentMarks);
OleDbCommand dbCmd = new OleDbCommand(sqlStudentMarks, dbCon);
OleDbDataReader dbReader = dbCmd.ExecuteReader();

失败,错误为IErrorInfo.GetDescription failed with E_FAIL(0x80004005)。在ExecuteReader行。

从字符串写入的调试输出是:

"select [Module.ID], [Module.mname], [ModuleMarks.Mark] FROM (Student LEFT OUTER JOIN ModuleMarks ON Student.ID = ModuleMarks.StudentId) LEFT OUTER JOIN Module ON ModuleMarks.ModuleId = Module.ID where Student.ID = 1;"

我应该注意到我在没有冒号的情况下尝试了它,它仍然提供相同的错误。

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:1)

我的猜测模块保留字词。将Module更改为[Module]

不要使用保留字或在字段名称或表名称周围加上方括号[],即:

您已使用带有tablename和column name的Square括号作为[Module.ID],但您应将其用作[Module] .ID。

试试这个

select [Module].ID, [Module].mname, [ModuleMarks].Mark 
FROM Student LEFT OUTER JOIN ModuleMarks ON Student.ID = ModuleMarks.StudentId LEFT OUTER JOIN [Module] ON ModuleMarks.ModuleId = [Module].ID where Student.ID = 1;
  

Access Reserved words and symbols

答案 1 :(得分:0)

SELECT md.ID,md.mname,mm.Mark FROM Student s        LEFT OUTER JOIN ModuleMarks mm             ON s.ID = mm.StudentId        LEFT OUTER JOIN [模块] md             ON mm.ModuleId = md.ID WHERE s.ID = 1;

答案 2 :(得分:-1)

尝试使用OleDbDataAdapter:

        OleDbDataAdapter da = new OleDbDataAdapter(sqlStudentMarks, dbCon);
        OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
        DataTable dt = new DataTable();
        da.Fill(dt);

这对我很好。