【问题标题】:How to ignore MS Access "Type Conversion Error" when running SQL statement from C#?从 C# 运行 SQL 语句时如何忽略 MS Access“类型转换错误”?
【发布时间】:2016-06-13 02:40:02
【问题描述】:

我有一个带有数百列表的 MS Access 数据库。运行我的 SQL INSERT INTO 查询时,一个(或多个)字段会导致“类型转换错误”,这很好,因为它仍然可以工作。当我通过 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 中是否有“忽略所有类型转换警告”的选项或修改我的 SQL 字符串的方法?还是我必须浏览所有数百列并确保它们都是正确的类型。

【问题讨论】:

  • 我已经尝试过了,但它不是很有帮助。这个问题似乎也没有真正解决,只是标记为正确。
  • “或者我必须浏览所有数百列并确保它们都是正确的类型。” - 恐怕你会。 C# 是强类型的,所以不会让你逃脱这种事情。
  • 当您说您在 Access GUI 中“简单地忽略弹出消息”时,您指的是警告说:“Microsoft Access 无法在追加查询中追加所有记录. 由于类型转换失败,Microsoft Access 将 1 个字段设置为 Null,...若要忽略错误并运行查询,请单击是。" ?
  • (提示:如果这确实是您所指的对话框,那么可以,可以从 C# 运行带有“忽略错误(s )" 选项。)

标签: c# sql ms-access type-conversion oledb


【解决方案1】:

在 Access 中执行“操作查询”(INSERT、UPDATE 或 DELETE)时,我们可以选择在遇到错误时如何继续。例如,给定一个名为 [tbl_Log] 的空表,其中包含字段

ID - 长整数,主键
DateValue - 日期/时间

还有一个名为 [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,...

要忽略错误并运行查询,请单击“是”。

如果我们单击“否”,则整个 INSERT 将被取消。如果我们单击“是”,则插入有效数据并将无效值设置为 Null:

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

在 .NET 应用程序中,System.Data.OleDb 没有“忽略错误”选项,但 Access DAO 有。因此,要达到与在 Access 对话框中单击“是”相同的效果,我们可以这样做

// 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 选项,这相当于在“访问”对话框中单击“否”并取消整个操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多