如何忽略 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 字符串的方法?还是我必须遍历所有数百列并确保它们都是正确的类型。

如何忽略 MS 访问“类型转换错误”时从 C# 运行 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 选项,这等效于在"访问"对话框中单击"否"并取消整个操作。