相同的更新 - 内连接语句不起作用?

时间:2017-01-18 07:11:02

标签: c# ms-access oledb

我的程序抛出以下错误

  

UPDATE语句中的错误:OleDb(0x80040E14)

,没有别的。

在过去的一周里,我一直在努力调整这些代码并进行微调,但一切都会发生故障。

这是相同的样本:

conn.Open();
string sqls = @"INSERT INTO ABCD SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" + openFileDialog.FileName + "].[" + txtSheetName.Text + "$];";
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = sqls;
cmd.ExecuteNonQuery();
string updater =
    @"UPDATE ACTB " + @"INNER JOIN ABCD on ACTB.ID = ABCD.ID " +
    @"SET ACTB.Started = ABCD.Started, " +
    @"ACTB.Ended = ABCD.Ended ";
cmd.CommandText = updater;
cmd.ExecuteNonQuery();
string deleter = @"DELETE from ABCD";
cmd.CommandText = deleter;
cmd.ExecuteNonQuery();
conn.Close();

我只是粘贴了这个,以便你们知道join语句的逻辑已经是合理的。我正在将Excel文件中的内容添加到ID匹配的Access数据库中。 ACTB包含每个字段,并且有20个字段,其余字段除了最后四个字段外无关紧要:CTC,POI,DOI,AMT,当然还有开头的ID。 excel文件的结构方式相同:ID,CTC,POI,DOI,AMT以及与访问数据库数据匹配的一些数据和ID数据。

带有打嗝的代码:

插入声明

conn.Open();
string sqls = @"INSERT INTO ACTC SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" + openFileDialog.FileName + "].[" + txtSheetName.Text + "$];";
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = sqls;
cmd.ExecuteNonQuery();

单独使用insert语句,所以我知道可以读取ACTC表。

其余代码:

string updater =
    @"UPDATE ACTB " + @"INNER JOIN ACTC on ACTB.[ID] = ACTC.[ID] " +
    @"SET ACTB.[CTC] = ACTC.[CTC], " +
    @"SET ACTB.[POI] = ACTC.[POI], " +
    @"SET ACTB.[DOI] = ACTC.[DOI], " +
    @"ACTB.[AMT] = ACTC.[AMT] ";
cmd.CommandText = updater;
cmd.ExecuteNonQuery();
string deleter = @"DELETE from ACTC";
cmd.CommandText = deleter;
cmd.ExecuteNonQuery();   
conn.Close();

我在看另一个保留字的问题吗? 我的更新声明有什么问题?
我如何使这些错误消息更有意义?

1 个答案:

答案 0 :(得分:2)

更新

我的答案的第一个版本是基于sql server的更新语法。从你的评论来看,似乎ms访问的更新语法有点不同。但是,您的更新语句中仍然存在一些奇怪的内容 - 您多次使用关键字SET。试试这个:

string updater =
@"UPDATE ACTB " + @"INNER JOIN ACTC on ACTB.[ID] = ACTC.[ID] " +
@"SET ACTB.[CTC] = ACTC.[CTC], " +
@"ACTB.[POI] = ACTC.[POI], " +
@"ACTB.[DOI] = ACTC.[DOI], " +
@"ACTB.[AMT] = ACTC.[AMT] ";

第一个版本

我不确定ms-access是否支持使用内部联接进行更新,但如果确实如此,那么您的语法有点偏离。 请尝试使用此语法:

 UPDATE ACTC 
 SET ACTB.[CTC] = ACTC.[CTC], 
     ACTB.[POI] = ACTC.[POI], 
     ACTB.[DOI] = ACTC.[DOI], 
     ACTB.[AMT] = ACTC.[AMT] 
 FROM ACTC 
 INNER JOIN ACTC on ACTB.[ID] = ACTC.[ID]