我试图在C#中使用DateTime
将空DbParameter
插入到FoxPro数据库中。我们的应用程序将FoxPro数据与SQL Server和.NET模型/数据结合在一起。
我目前的问题是,我们在C#中的大多数DateTime
类型都不是可空的,也不应该是空的。但是,FoxPro中的大多数遗留数据都是空日期(显示为“/ / ::”)。我试图插入FoxPro表,我检查是否.NET DateTime
符合某些标准,然后插入一个空日期。最后一部分已被证明是一场噩梦。
到目前为止我尝试过的:
.Parameters.Add(string.Empty, new DateTime())
以上可以理解地插入01/01/0001
但不是我们想要的。
.Parameters.Add(string.Empty, "{}")
.Parameters.Add(string.Empty, "{:://}")
.Parameters.Add(string.Empty, "{//}")
.Parameters.Add(string.Empty, "'{}'")
以上都导致了
System.Data.OleDb.OleDbException:'数据类型不匹配'。
这是有道理的,因为我试图将string
发送到DateTime
类型的字段。
有谁知道如何将空DateTime
插入FoxPro?
如果我正确理解你,你不是使用DbParameter
,而是使用OleDbParameter
,你是通过OleDbParameterCollection.Add
方法添加它们的?
如果是这样,请考虑您正在使用.Add(String, Object)
的重载,而您可以使用.Add(String, OleDbType)
的重载:
.Parameters.Add(string.Empty, OleDbType.Date)
OleDbParameter
的默认值是null
,因此您不需要为空日期做更多的事情。
此外,根据您的FoxPro数据库架构中的列的定义方式,可能适合传递OleDbType.Date
,OleDbType.DBDate
,OleDbType.DBTime
或OleDbType.DBTimeStamp
。 full list of OleDB types is documented here,但我不完全确定它们如何与FoxPro的数据类型保持一致。
我相信你的第二个例子很接近,但你有相反的日期和时间部分。
它应该是.Parameters.Add(string.Empty, "{//::}")
//
代表Date部分,::
代表Time部分。
不确定您的VFP的SQL-Insert语句,但您可能需要调整它并执行两个不同的插入。一个IF存在一个日期,如果不存在则另一个日期存在。
对于没有日期的那个,我会硬输入以下内容(例如“?”是参数占位符)
insert into yourTable ( fld1, fld2,..., YourDateField ) values ( ?, ?, ..., ctot('') )
函数CTOT()表示字符到datetime,空字符串将符合预期的VFP日期/时间字段。