#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
orCalliD
, это работает — что это сейчас?2. @JonSkeet я уже упоминал об этом в вопросе — CallID .
3. Спасибо — не уверен, почему я не мог видеть это раньше. Я уверен, что это «проблема турецкого I» — просто не на стороне базы данных.
Ответ №1:
Я предполагаю, что проблема возникает не на стороне базы данных вообще, а когда локальный код ( DataSet
) ищет ваш столбец.
Вероятно, самым простым решением является использование порядкового значения столбца вместо имени. В целях диагностики я предлагаю вам просмотреть имена столбцов, возвращаемые DataTable.Columns
и попробовать различные подходы для сопоставления имени без учета регистра / культуры. Если вы не знаете порядковый номер заранее, возможно, вам захочется найти его таким образом динамически, если DataSet
не удается найти его: (
Комментарии:
1. Ваше предположение действительно верно, проблема возникает не на стороне базы данных. Я, наконец, установил турецкую установку на локальный компьютер и обнаружил, что запросы с
select * from tableName
приводят к упомянутому исключению. Однако при явной настройке имен столбцов (select columnA, columnB from tableNAme
) в запросе он работает нормально.