相同的更新 - 内部连接语句不起作用?
Identical update - inner join statements don't work?
我的程序抛出以下错误
ERROR in UPDATE statement: 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();
插入语句单独工作,所以我知道 ACTC table 可以读取。
其余代码:
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();
我是否在查看另一个保留字问题?
我的更新语句有什么问题?
我该如何使这些错误消息更有意义?
更新
我的答案的第一个版本是基于 sql 服务器的更新语法。从您的评论来看,ms access 中的更新语法似乎有点不同。但是,您的更新语句中仍然有些奇怪 - 您多次使用关键字 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]
我的程序抛出以下错误
ERROR in UPDATE statement: 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();
插入语句单独工作,所以我知道 ACTC table 可以读取。
其余代码:
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();
我是否在查看另一个保留字问题?
我的更新语句有什么问题?
我该如何使这些错误消息更有意义?
更新
我的答案的第一个版本是基于 sql 服务器的更新语法。从您的评论来看,ms access 中的更新语法似乎有点不同。但是,您的更新语句中仍然有些奇怪 - 您多次使用关键字 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]