在 c# 中将 datetime() 记录转换为日期,以便导入到 VFP 数据库中

Convert a datetime() record to date in c# for importation into VFP database

我目前正在构建数据 export/import 工具,用于将数据从 excel 或 CSV 文档提取到 Visual Fox Pro 数据库中。

我相信代码可以正常运行,但是在执行时我收到数据类型不匹配错误。

经过一番调查后,我注意到我提取的日期格式与我推送的字段之间存在差异。

Fox pro 数据库设置为获取日期记录,但是我尝试推送的数据是日期时间格式(原始记录是日期),但据我所知,c# 只能原生进行日期时间转换。

从 excel 获取日期的代码如下:

importCommand.Parameters["TENSDATE"].Value = exportReader.IsDBNull(0)
     ? (object) DBNull.Value
     : DateTime.Parse(exportReader.GetValue(0).ToString());

现在,我看到很多人使用类似的东西:

exportReader.GetValue(0).ToString("dd/MM/yyyy")

但是我似乎无法正常运行。谁能告诉我实现目标的最佳方法。

如果你想解析特定格式的日期,你应该使用 DateTime.TryParseExact 方法。您将能够将特定格式作为参数传递。请参考:https://msdn.microsoft.com/en-us/library/ms131044(v=vs.110).aspx

您需要在将字段添加到参数时提供字段类型。在这种特定情况下,OdbcType.DateTime 用于日期字段。

importCommand.Parameters.Add("@TENSDATE", OdbcType.DateTime).Value = exportReader.IsDBNull(0)
     ? (object) DBNull.Value
     : DateTime.Parse(exportReader.GetValue(0).ToString());

(Joshua Cameron-Macintosh,请关闭您打开的话题)

尽管我事先警告过,但您正在尝试以艰难的方式做到这一点。 VFP 是一种很好的以数据为中心的语言,并且足够聪明,可以将 DateTime 值放入 Date 或 DateTime 字段中。它也足够聪明地解析表示日期(时间)的文本值 - 在文本的情况下,就像任何其他数据库或 non-database 解析器一样,它根据给定规则(例如使用常见的规范 ODBC 格式)进行解析yyyyMMdd HH:mm:ss 没问题,或者如果指示使用 DMY 格式,它知道 1/2/2000 表示 2000 年 2 月 1 日等)。总而言之,问题根本不在 VFP 方面。如果您使用 CSV,那么请确保您使用的是 ODBC 规范格式的日期(例如 SQL 服务器也是如此)。如果是 Excel 文件,只要你有正确的数据类型,你可以直接传输而不需要额外的工作,特别是 DBNull 试验是完全没有必要的,VFP 已经知道 DbNull.Value。

无论如何,代码总是会说话更好。 对于此示例,假设您有一个带有 SampleSheet sheet 的 excel 文件 (d:\temp\ExcelImportData.xlsx),其中数据列为:

Customer ID: string
Order ID: integer
Ordered On: DateTime && where time parts were insignificant fro demo purposes
Shipped On: DateTime && Has NULL values

(您可以使用 Northwind 示例数据库的订单 table 构建这样的示例 sheet)

有一个 VFP table (d:\temp\SampleImport.dbf) 作为接收方,其中列信息为:

CustomerId: Char(10) NOT NULL
OrderID: Int NOT NULL
OrderDate: Date NOT NULL
ShippedOn: DateTime NULL 

这是使用 reader 的简单 read/write:

void Main()
{
    var vfpConnection = @"Provider=VFPOLEDB;Data Source=D:\temp";
    var xlsFileName = @"D:\temp\ExcelImportData.xlsx";
    var xlsConnection = $@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={xlsFileName};" +
    "Extended Properties=\"Excel 12.0;HDR=Yes\"";
    var xlsTableName = "SampleSheet$";
    using (var xlsCon = new OleDbConnection(xlsConnection))
    using (var vfpCon = new OleDbConnection(vfpConnection))
    {
        var cmdInsert = new OleDbCommand(@"insert into SampleImport
        (CustomerId, OrderId, OrderDate, ShippedOn)
        values
        (?,?,?,?)", vfpCon);
        cmdInsert.Parameters.Add("customerId", OleDbType.WChar);
        cmdInsert.Parameters.Add("orderId", OleDbType.Integer);
        cmdInsert.Parameters.Add("orderDate", OleDbType.Date);
        cmdInsert.Parameters.Add("shippedOn", OleDbType.Date);

        var readXl = new OleDbCommand($"select * from [{xlsTableName}]", xlsCon);
        xlsCon.Open();
        vfpCon.Open();
        var xlReader = readXl.ExecuteReader();
        while (xlReader.Read())
        {
            cmdInsert.Parameters["customerId"].Value = xlReader["Customer ID"];
            cmdInsert.Parameters["orderId"   ].Value = xlReader["Order ID"];
            cmdInsert.Parameters["orderDate" ].Value = xlReader["Ordered On"];
            cmdInsert.Parameters["shippedOn" ].Value = xlReader["Shipped On"];
            cmdInsert.ExecuteNonQuery();
        }
        xlsCon.Close();
        vfpCon.Close();
    }
}