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

时间:2017-01-13 09:46:14

标签: c# excel date datetime visual-foxpro

我目前正在构建一个数据导出/导入工具,用于从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")

然而,我似乎无法实现这一功能。有人可以告诉我实现目标的最佳途径。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

将参数添加到参数时,需要提供字段类型。在这种特定情况下,<section class="panel-body"> <ul class="nav nav-tabs" ng-init="activeTab = 'details'"> <li ng-class="{ active: activeTab === 'details' }"> <a ng-click="activeTab = 'details'" href="#">Details</a> </li> <li ng-class="{ active: activeTab === 'options' }"> <a ng-click="activeTab = 'options'" href="#">Options</a> </li> <li ng-class="{ active: activeTab === 'other' }"> <a ng-click="activeTab = 'other'" href="#">Other</a> </li> </ul> <div class="tab-content"> <div class="tab-pane" ng-class="{ active: activeTab === 'details' }">Details tab content.</div> <div class="tab-pane" ng-class="{ active: activeTab === 'options' }">Options tab content.</div> <div class="tab-pane" ng-class="{ active: activeTab === 'other' }">Other tab content.</div> </div> </section> 表示日期字段。

OdbcType.DateTime

答案 2 :(得分:0)

(Joshua Cameron-Macintosh,请关闭你的开放主题)

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

无论如何,代码总是说得更好。 对于此示例,假设您有一个带有SampleSheet表的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示例数据库的Orders表构建此类样本表)

有一个VFP表(d:\ temp \ SampleImport.dbf)作为列信息为的接收者:

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

以下是使用阅读器的简单读/写:

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();
    }
}