(约书亚·卡梅伦的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();
}
}
日期类型的值没有格式。 FoxPro是否有'date'或'datetime'字段类型?将日期存储为字符串是一个非常严重的错误。 'TENSDATE'是什么类型?还要注意'GetValue'返回任何东西作为'object'。如果该值是一个字符串,则必须先解析它。如果它是双倍的,它可能是OADate没有被提供者转换。您可以使用'DateTime.FromOADate(double)'将其转换为' –
今天谁在使用VFP?这是2017年! – silkfire
@silkfire,是否正在使用受年限约束的VFP?这就像问今天谁在使用Fortran(可能还是最快的语言)。 –