2009-03-13 1 views
0

У нас есть некоторые клиенты, использующие наше толстое клиентское приложение .NET 2.0, которое испытывает странные, прерывистые ошибки, считывающие данные с сервера SQL 2000 SP4, где действия выполнялись всего за несколько мгновений раньше. У нас есть некоторые клиенты, использующие SQL 2000 (и многие из которых используют 2005), где эти ошибки не возникают.Как диагностировать ArgumentOutOfRangeException в SqlDbType?

Одна вещь, которую я замечаю, это то, что приложение в наших тестовых средах ссылается на System.Data 2.0.50727. ; тогда как приложение ссылается на 2.0.50727. о системах заказчика. В чем разница между этими двумя версиями и может ли это быть связано с ошибками, описанными ниже?

Вот пример трассировки стека ошибок, где значение перечисления равно 8, но у меня есть еще много экземпляров, где значение перечисления «вне границ» равно 4 или 14 с той же точной трассировкой стека. Знают ли значения перечисления иногда, но не в другое время? Как насчет того, когда одна и та же часть приложения работает без ошибок?

TYPE: System.ArgumentOutOfRangeException 
MSG: The SqlDbType enumeration value, 8, is invalid. 
Parameter name: SqlDbType 
SOURCE: System.Data 
SITE: GetSqlDataType 

at System.Data.SqlClient.MetaType.GetSqlDataType(Int32 tdsType, UInt32 userType, Int32 length) 
at System.Data.SqlClient.TdsParser.CommonProcessMetaData(TdsParserStateObject stateObj, _SqlMetaData col) 
at System.Data.SqlClient.TdsParser.ProcessMetaData(Int32 cColumns, TdsParserStateObject stateObj) 
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
at System.Data.SqlClient.SqlDataReader.NextResult() 
at Ceoimage.Basecamp.Data.Document._GetDocumentModelWithCollections(IDataReader rdr) 

Обновление: Я скачал System.Data от одного из рабочих станций клиентов. Они имели две версии в GAC: одну в каталоге GAC и одну в каталоге GAC_32. В GAC номер версии 1.14322.2365. В GAC_32 номер версии 2.0.50727.1433, как описано выше. Во всех трех вариантах, однако, SqlDbType перечислимы отображает те же Int значения для одних и тех же типов, для тех, кто в сообщениях об ошибках:

DateTime = 4 
Int = 8 
UniqueIdentifier = 14 

Я боюсь, что версия может быть отвлекающий маневр: если проблема имеет с каркасными версиями, не должна ли проблема возникать в 100% случаев, а не быть переходной?

ответ

2

Ваш клиент находится на .NET 2.0 без установленного 3.5. Ваши тестовые серверы - 3.5. Единственными вещами, добавленными в перечисление в 3.5, являются:

Structured 
Date 
Time 
DateTime2 
DateTimeOffset 

Это не означает, что не существует каких-либо основных изменений.

Если возможно, я проверил бы приложение под 2.0 без установки 3.5 и посмотрю, какие ошибки вы получаете. Это должно дать вам хорошее место для начала.

Чтобы вычислить погрешность, мне пришлось бы перебирать перечисление и видеть, в каком порядке находятся элементы в перечислении. Reflector - отличный инструмент для этого, но вам нужно будет сделать это как в системе 2.0, так и в системе 3.5, чтобы увидеть изменения.

+0

Спасибо за хорошее начало. Рассматривая Reflector, SqlDbType со значением 8 является Int. Мое приложение не будет работать, если у него возникнут проблемы с чтением Ints из базы данных. Как в мире это происходит, и как это может быть так кратковременно, если оно связано с каркасной версией? – flipdoubt

2

This ancient discussion отслеживает аналогичную ошибку до использования соединения, созданного в одном потоке, для выполнения запроса в другом потоке. SqlConnection "instance members are not guaranteed to be thread safe". Если приложение многопоточное, убедитесь, что соединения используются правильно.

Проблема может также быть частью SQL-сервера, которая была устранена в более поздних версиях.

Я отвечаю, потому что я столкнулся с этой ошибкой при использовании SqlCommand.Cancel с SQL 2005. (Есть несколько исключений, которые происходят в дополнение к «Операция, отмененная пользователем» в зависимости от того, когда запрос отменен.) Я вижу это как «неожиданный ответ от ошибки сервера» ... вероятно, это хорошая идея, чтобы очистить пул соединений, если это произойдет.

How to cancel a long-running Database operation?

How to force a SqlConnection to physically close, while using connection pooling?

0

это solution может решить вашу проблему:

Ваш локальный ящик с помощью SQL Server 2008, но другой ящик 2005? Параметр @RUNTIME имеет тип SqlDbType.Time. Этот тип не существовал в SQL Server 2005. Также SqlDbType.Time имеет значение 32, как указано в исключении. Вы не можете сохранить только значения времени, прежде чем SQL Server 2008. Вы должны хранить @RUNTIME как SqlDbType.DateTime в 2005

И если вы используете .NET Framework 2.0 использования необходимо установить .NET Framework 2.0 SP2 и sql2008 для решения этой проблемы.