2016-01-22 5 views
0

У меня есть дата из базы данных, как показано на рисунке ниже. DateTime-imageНевозможно преобразовать дату Db в DateTime

Однако, когда я конвертирую это значение в DateTime-instance, я получаю сообщение об ошибке, показанном ниже. enter image description here

Однако при запуске кода я получаю InvalidCastException, что возвращаемое значение не может быть отнесено к DateTime.

Я использую VS2010 на .Net3.5, поэтому я задаюсь вопросом, зачем нужна эта библиотека вообще.

В рамках ссылочной сборки я использую IronPython, который использует DLR, насколько мне известно. В .Net 3.5 я могу использовать это, однако, когда ссылаюсь на Microsoft.Scripting и Microsoft.Scripting.Core также. Я предполагаю, что это вызывает ошибку. Странно, что код, использующий IronPython, вообще не вызывается при выполнении кода, производящего это исключение.

EDIT: Для тех, кто не верит: тот же код работает некоторое время, запрашивая некоторые строки из базы данных и возвращая правильные даты. Однако в какой-то момент он выдает это исключение.

Дальнейшее ИЗМЕНЕНИЕ: Как вы можете видеть на первом изображении row.GetValue возвращает dynamic, что странно, поскольку сборка (ArcGIS 10.2 для рабочего стола), где этот код реализован, также записывается с использованием .Net 3.5. Более того, когда я перехожу к определению этого типа, я получаю object get_Value(int Index); вместо dynamic.

+2

Пробовал ли вы Convert.ToDateTime() или DateTime.Parse() –

+2

, предоставляя некоторый код, было бы хорошо, особенно ваши сообщения и ссылки –

+0

, что вы пробовали? –

ответ

1

Вам необходимо как минимум .NET framework 4.0 использовать dynamic. Компилятор позволит определить и назначить dynamic переменные, но когда вы пытаетесь сделать что-нибудь с переменной dynamic, вы столкнетесь с этой ошибкой

Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported 

Пожалуйста, обратитесь к C# 4.0 and .Net 3.5 для более подробной информации. Заслуга этого Aaronaught (что ответить на этот вопрос)

Update:

на .Net 3.5, я могу использовать это, однако при обращении Microsoft.Scripting и Microsoft.Scripting.Core также. Я предполагаю, что это вызывает ошибку.

У IronPython есть свои собственные Microsoft.Scripting и Microsoft.Scripting.Core. Когда вы снова ссылаетесь на эти две сборки, он будет закрывать DLL IronPythons и использовать тех чиновников, которые, я считаю, вызывают эти странные поступки. Попробуйте удалить ссылку и посмотреть, помогает ли она

+0

Я знаю, что я могу использовать 'dynamic' только на 4.0 вверх. Однако я не использую keyowrd, как вы видите в моем втором обновлении. – HimBromBeere

+1

На основе http://www.mikesdotnetting.com/article/214/how-to-check-if-a-query-returns-data-in-asp-net-web-pages, , когда вы используете 'queryvalue' или 'querysingle', он фактически возвращает объект' dynamic' – pengMiao

+0

, какую версию ironpython вы используете? – pengMiao

0

Я нашел действительно странное поведение, объясняющее исключения.

Прежде всего InvalidCastException был абсолютно прав, как призыв к row.Get_Value(2) фактически вернулся DBNull, который, конечно, не может быть приведен к DateTime.

Следующего значение, отображаемое в QuickWatch wasn't правильной, так как VS показал мне whrong линии для этого исключения делает меня предположить, что вызов (DateTime) row.Get_Value(2) вызвавшей ошибку вместо вызова row.Get_Value(1) (который preceds бывший).Последний, однако, возвращает DBNull, как уже упоминалось.

Последнее, но не менее важное: беспорядочный материал с отсутствующей библиотекой, очевидно, вызван самой ArcGIS. Поскольку @pengMiao уже предполагал, что этот вызов фактически возвращает dynamic (хотя его подпись упоминает только object). Теперь QuickWatch не достаточно умен, чтобы напрямую использовать его для любого правильного типа (в моем случае DateTime). Однако, если я напишу (DateTime)(object) row.Get_Value(2), предоставляя листинг object, а затем до DateTime, мы получим то, что хотим, и в QuickWatch, и в исполняемом файле.

Мне все еще не ясно, почему в QuickWatch мы получаем dynamic { DateTime } как тип данных для возвращаемого значения, однако оно работает сейчас.

Смежные вопросы