2017-01-13 25 views
0

我目前正在构建一个数据导出/导入工具,用于将数据从Excel或CSV文档拖入Visual Fox Pro数据库。在c#中将日期时间()记录转换为日期以便导入到VFP数据库中

我相信代码是功能的,但执行后我收到一个数据类型不匹配错误。

经过一番调查后,我发现我拉的日期格式和我要推送的字段之间存在差异。

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") 

但是我似乎无法到得到这个功能。有人能告诉我最好的方法来实现我的目标。

+0

日期类型的值没有格式。 FoxPro是否有'date'或'datetime'字段类型?将日期存储为字符串是一个非常严重的错误。 'TENSDATE'是什么类型?还要注意'GetValue'返回任何东西作为'object'。如果该值是一个字符串,则必须先解析它。如果它是双倍的,它可能是OADate没有被提供者转换。您可以使用'DateTime.FromOADate(double)'将其转换为' –

+0

今天谁在使用VFP?这是2017年! – silkfire

+2

@silkfire,是否正在使用受年限约束的VFP?这就像问今天谁在使用Fortran(可能还是最快的语言)。 –

回答

0

您需要在将字段添加到参数时提供该字段的类型。在此特定情况下,日期字段为OdbcType.DateTime

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

嗨,队友,这解决了这个问题。仍然有数据类型不匹配,但我会在适当的时候对它们进行排序。 –

+1

它真的解决了什么?你创建了一个不存在的问题来解决。 –

0

(约书亚·卡梅伦的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了。

无论如何,代码总是说得更好。 对于此示例假设你有一个Excel文件(d:\ TEMP \ ExcelImportData.xlsx)与SampleSheet片,你有数据列如下:

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

(您可以使用罗斯文示例数据库的建立这样一个样纸订单表)

有一个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 = [email protected]"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(); 
    } 
} 
相关问题