当来自 C# 的 运行 SQL 语句时如何忽略 MS Access "Type Conversion Error"?

How to ignore MS Access "Type Conversion Error" when running SQL statement from C#?

我有一个 MS Access 数据库,其中 table 有数百列。当 运行 连接我的 SQL INSERT INTO 查询时,一个(或多个)字段导致 "Type Conversion Error",这很好,因为它仍然有效。当我通过 MS Access GUI 运行 SQL INSERT INTO 这个过程时,我只是忽略了弹出消息。

例如:

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 中是否有 "ignore all type conversion warnings" 选项或修改 SQL 字符串的方法?或者我是否必须浏览所有数百列并确保它们都是正确的类型。

在 Access 中执行 "action query"(插入、更新或删除)时,我们可以选择遇到错误时如何处理。例如,给定一个名为 [tbl_Log] 且字段为

的空 table

ID - 长整数,主键
日期值 - Date/Time

和一个名为 [tbl_Data] 的 table 字段

ID - 长整数,主键
DateString - 文本(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 set 1 field(s) to Null due to a type conversion failure, ...

To ignore the error(s) and run the query, click Yes.

如果我们点击"No"那么整个INSERT就被取消了。如果我们单击 "Yes",则会插入有效数据并将无效值设置为 Null:

ID  DateValue
--  ----------
 1  2016-01-01
 2  
 3  2016-03-03

在 .NET 应用程序中,System.Data.OleDb 没有 "ignore the error(s)" 选项,但 Access DAO 有。因此,要达到与在 Access 对话框中单击 "Yes" 相同的效果,我们可以执行

// 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 选项,这相当于在 Access 中单击 "No"对话框并取消整个操作。