将 C# 中的空 DateTime 插入 FoxPro

Insert empty DateTime from C# into FoxPro

我正在尝试使用 C# 中的 DbParameter 将空的 DateTime 插入到 FoxPro 数据库中。我们的应用程序将 FoxPro 数据与 SQL 服务器和 .NET models/data.

结合在一起

我当前的问题是 C# 中的大多数 DateTime 类型都不可为空,也不应该为空。但是,我们在 FoxPro 中的大部分遗留数据都是空日期(显示为“/ / : :”)。我正在尝试插入到 FoxPro table 中,在那里我检查 .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: 'Data type mismatch'.

这是有道理的,因为我正在尝试将 string 发送到 DateTime 类型的字段。

有谁知道如何将空 DateTime 插入 FoxPro?

我相信你的第二个例子很接近,但你的日期和时间部分颠倒了。

应该是.Parameters.Add(string.Empty, "{//::}")

//代表日期部分,::代表时间部分。

不确定您的 SQL-VFP 插入语句,但您可能需要调整它并执行两次不同的插入。一个如果日期存在,另一个如果不存在。

对于没有日期的,我会硬输入以下内容(例如“?”是参数占位符)

insert into yourTable ( fld1, fld2,..., YourDateField ) values ( ?, ?, ..., ctot('') )

函数 CTOT() 表示字符到日期时间,空字符串将符合预期的 VFP Date/time 字段。

如果我没理解错的话,你不是在使用 DbParameter,而是在使用 OleDbParameter,并且是通过 OleDbParameterCollection.Add 方法添加的?

如果是这样,请考虑您正在使用 .Add(String, Object) 的重载,您可以改为使用 .Add(String, OleDbType):

的重载
.Parameters.Add(string.Empty, OleDbType.Date)

OleDbParameter 的默认值为 null,因此您无需为空日期做任何其他操作。

此外,根据列在 FoxPro 数据库架构中的定义方式,传递 OleDbType.DateOleDbType.DBDateOleDbType.DBTimeOleDbType.DBTimeStamp 可能是合适的. full list of OleDB types is documented here,但我不完全确定它们如何与 FoxPro 的数据类型对齐。