如何忽略 MS 访问“类型转换错误”时从 C# 运行 SQL 语句
本文关键字:时从 运行 SQL 语句 错误 MS 何忽略 访问 类型转换 | 更新日期: 2023-09-27 18:36:43
我有一个MS Access数据库,其中包含一个包含数百列的表。运行我的 SQL INSERT INTO 查询时,一个(或多个)字段会导致"类型转换错误",这很好,因为它无论如何都可以工作。当我通过MS Access GUI运行SQL插入的过程时,我只是忽略弹出消息。
例如:
INSERT INTO tbl_Log (ID, PID, Customer_ID...)
SELECT tbl_Data.ID, tbl_Data.PID, tbl_Data.Customer_ID...
FROM tbl_Data
但是,当我通过 C# 运行查询并通过 Oledb 发送查询字符串时,查询失败(我怀疑是由于类型转换错误)。如何忽略此错误并继续查询。.通过 C#?
GUI 中是否有"忽略所有类型转换警告"的选项或修改 SQL 字符串的方法?还是我必须遍历所有数百列并确保它们都是正确的类型。
在 Access 中执行"操作查询"(插入、更新或删除)时,我们可以选择在遇到错误时如何继续。例如,给定一个名为 [tbl_Log] 的空表,其中包含字段
ID - 长整数,主键
日期值 - 日期/时间
以及一个名为 [tbl_Data] 的表,其中包含字段
ID - 长整数,主键
日期字符串 - 文本(10)
和示例数据
ID DateString
-- ----------
1 2016-01-01
2 (unknown)
3 2016-03-03
如果我们运行查询
INSERT INTO tbl_Log (ID, DateValue)
SELECT ID, DateString
FROM tbl_Data;
我们看到一个对话框,部分说
Microsoft 由于类型转换失败,Access 将 1 个字段设置为 Null,...
若要忽略错误并运行查询,请单击"是"。
如果我们单击"否",则整个插入将被取消。如果我们单击"是",则插入有效数据并将无效值设置为 Null:
ID DateValue
-- ----------
1 2016-01-01
2
3 2016-03-03
在.NET应用程序中,System.Data.OleDb
没有"忽略错误"选项,但Access DAO有。因此,要达到与在"访问"对话框中单击"是"相同的效果,我们可以这样做
// This code requires the following COM reference in your project:
//
// Microsoft Office 14.0 Access Database Engine Object Library
//
// and the declaration
//
// using Microsoft.Office.Interop.Access.Dao;
//
// at the top of the class file
var dbe = new DBEngine();
Database db = dbe.OpenDatabase(@"C:'Users'Public'Database1.accdb");
string sql =
"INSERT INTO tbl_Log (ID, DateValue) " +
"SELECT ID, DateString " +
"FROM tbl_Data";
db.Execute(sql);
请注意,.Execute
方法不使用 RecordsetOptionEnum.dbFailOnError
选项,这等效于在"访问"对话框中单击"否"并取消整个操作。