当来自 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"对话框并取消整个操作。
我有一个 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] 且字段为
的空 tableID - 长整数,主键
日期值 - 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"对话框并取消整个操作。