我目前正在构建一个数据导出/导入工具,用于从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")
然而,我似乎无法实现这一功能。有人可以告诉我实现目标的最佳途径。
答案 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();
}
}