我有以下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;"
我应该注意到我在没有冒号的情况下尝试了它,它仍然提供相同的错误。
感谢您提供的任何帮助。
答案 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;
答案 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);
这对我很好。