Исключение ArgumentException из DataRow.Item() в турецкой установке Window server 2008

#c# #sql-server-2005 #.net-2.0 #windows-server-2008-r2 #turkish

#c# #sql-server-2005 #.net-2.0 #windows-server-2008-r2 #Турецкий

Вопрос:

Наше программное обеспечение было установлено на (сайте заказчика) Window Server 2008 R2 Foundation в Турции (поэтому язык установлен на турецкий, и, следовательно, все меню и сообщения отображаются на турецком языке). Мы используем SQL server 2005 express. Сопоставление базы SQL_Latin1_General_CP1_CI_AI данных (как и на других наших английских установленных сайтах).

Наш код запрашивает базу данных с помощью простого запроса: select * form tableName where callid='variable' (callid — наш первичный ключ, однако имя столбца в базе данных — CallID, тип столбца — varchar(60) ), используя SqlDataAdapter.Fill() метод для заполнения нашего нетипизированного DataSet .

Мы получаем DataRow объект из DataSet.Tables[0].Rows[0] . Мы передаем этот DataRow объект другим методам и используем DataRow.Элемент (строка) для получения значений столбцов. У нас есть несколько столбцов, значения которых мы получаем таким образом без проблем. Однако для одного конкретного столбца мы получаем

 ArgumentException: <column name> column does not belong to table Table
  

Этот столбец является нашим столбцом callid!
Когда мы меняем имя столбца в базе данных на callid или CallID, мы не получаем исключения.
Я видел эту статью под названием Introduct the Turkish I issue, и, насколько я понимаю, проблема, с которой обращается статья, заключается в том, что collation = TURKISH_CI_AS .

Чего мне здесь не хватает? Я был бы признателен за любой полезный вклад.

Спасибо, Илан

Комментарии:

1.Вы сказали, что когда вы меняете имя столбца на callid or CalliD , это работает — что это сейчас?

2. @JonSkeet я уже упоминал об этом в вопросе — CallID .

3. Спасибо — не уверен, почему я не мог видеть это раньше. Я уверен, что это «проблема турецкого I» — просто не на стороне базы данных.

Ответ №1:

Я предполагаю, что проблема возникает не на стороне базы данных вообще, а когда локальный код ( DataSet ) ищет ваш столбец.

Вероятно, самым простым решением является использование порядкового значения столбца вместо имени. В целях диагностики я предлагаю вам просмотреть имена столбцов, возвращаемые DataTable.Columns и попробовать различные подходы для сопоставления имени без учета регистра / культуры. Если вы не знаете порядковый номер заранее, возможно, вам захочется найти его таким образом динамически, если DataSet не удается найти его: (

Комментарии:

1. Ваше предположение действительно верно, проблема возникает не на стороне базы данных. Я, наконец, установил турецкую установку на локальный компьютер и обнаружил, что запросы с select * from tableName приводят к упомянутому исключению. Однако при явной настройке имен столбцов ( select columnA, columnB from tableNAme ) в запросе он работает нормально.