Вставьте пустой DateTime из C # в FoxPro - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь вставить пустой DateTime в базу данных FoxPro, используя DbParameter в C #.Наше приложение объединяет данные FoxPro вместе с моделями / данными SQL Server и .NET.

Моя текущая проблема заключается в том, что большинство наших DateTime типов в C # не допускают значения NULL и не должны.Тем не менее, большинство наших устаревших данных в 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?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Не уверен в вашем операторе SQL-Insert для VFP, но вам МОЖНО изменить его и сделать ДВА различных вставки.Один, ЕСЛИ дата существует, другой, если это не так.

Для того, у которого нет даты, я бы жестко ввел следующее (например, где "?" - это заполнители параметров)

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

функция CTOT () означает символ для даты и времени, и пустая строка будет соответствовать ожидаемому полю даты / времени VFP.

0 голосов
/ 21 февраля 2019

Если я правильно вас понимаю, вы используете не 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.Полный список типов OleDB документирован здесь , но я не совсем уверен, как они соответствуют типам данных FoxPro.

0 голосов
/ 21 февраля 2019

Я полагаю, что ваш второй пример близок, но у вас есть обратные части даты и времени.

Это должно быть .Parameters.Add(string.Empty, "{//::}")

// представляет часть даты, а:: Время порция.

...