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

Posted

技术标签:

【中文标题】相同的更新 - 内部连接语句不起作用?【英文标题】:Identical update - inner join statements don't work? 【发布时间】:2017-01-18 07:11:02 【问题描述】:

我的程序抛出以下错误

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,里面有一些数据和与access数据库数据匹配的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】:

更新

我的答案的第一个版本是基于 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]

【讨论】:

它确实支持它,我确保提到我的第一个代码块以避免这种情况。第一个运行良好,我在 ID 匹配的位置添加数据。现在我在主表中添加了更多字段并创建了 ACTC,更新了我的 sql 语句,但由于某种原因它不能正常工作。我试过你的代码,但它抛出一个“MISSING OPERATOR at”,然后是 ACTC.[AMT] 之后的文本。 没错!不敢相信我没有注意到这一点。现在可以了!复制粘贴自己的代码的危险!

以上是关于相同的更新 - 内部连接语句不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

mysql:内部查询在 selectif 语句中不起作用

带有内部查询的 SQL 插入语句不起作用

更新语句不起作用

我的内部连接不起作用 未知列

mysql过程中的更新语句不起作用

django - 内部连接查询集不起作用