Страницы: 1
RSS
Запрос к полям БД SQL Server при разных кодироках систем.
 
Есть БД SQL Server, название полей в которой заданы на Шведском языке. Когда в EXCEL формирую запрос к этой базе данных, то в зависимости от кодировки системы запрос либо обрабатывается или нет. На компьютерах пользователей используется и русская и английская кодировка системы. Как запрос сделать универсальным - не зависимым от кодировки системы. Пример что во что превращается на скрепке.
 
Названия полей прописаны в коде? Если да, то попробуйте ввести переменную и брать массив названий полей кодом из ячеек или из именованных формул.  
 
Например:  
 
Dim arrHeaders As Variant  
Dim strSQL As String  
 
arrHeaders=Worksheets(1).Range("A1:H1").Value  
 
strSQL = "SELECT [" & arrHeaders(1,1) & "],[" & arrHeaders(1,3) & "],[" & arrHeaders(1,5) & "] FROM ..."
KL
 
{quote}{login=KL}{date=05.01.2012 03:57}{thema=}{post}Названия полей прописаны в коде?  
Да название в прописаны в коде, но вся фишка в том, что где бы я не прописал название полей (даже в блокноте пытался) - они при другом ПК или при смене кодировки системы читаются как на картинке. Уже думал перебирать название полей БД, вникал в этот вопрос, но не получается. Не нашел как можно нумерацию полей и их название привести к общему знаменателю или как можно вообще перебрать по номеру название полей.
 
Было бы замечательно загнать название полей в массив зная логику последовательности запонения (по алфавиту, индексу или пр.) массива.
 
А база данных большая?  
1.если не большая, то можно считать в рекордсет всю таблицу и работать с рекордсетом.  
2. Если все же 1 Вариант не пройдет тогда, лучше всего положить вьюху на серевере с переименованными полями и обращаться с запросами уже к вьюхе.  
____________________  
Зы.. отрубайте руки тому программисту который использует имена полей и таблиц в локальной кодировке(усе павинна быць у ангельскай кадироУцы), :), хотя понимаю что Вы тут ни причем.
Спасибо
 
{quote}{login=kls}{date=05.01.2012 06:25}{thema=}{post}Было бы замечательно загнать название полей в массив зная логику последовательности запонения (по алфавиту, индексу или пр.) массива.{/post}{/quote}  
Ну так загоняйте с помощью ADO: arrData = rs.GetRows
KL
 
Вот тут примеры использования ADO, если что:  
 
Ole P. Erlandsen's Web Site  
http://www.erlandsendata.no/english/index.php?t=envbadac  
 
Ron de Bruin  
http://www.rondebruin.nl/ado.htm  
 
Ron de Bruin  
http://www.rondebruin.nl/accessexcel.htm
KL
 
Кирилл, добрый день или вечер :)  
Так он может recordset в массив загнать, а он же, не может его открыть, так как SQL синтаксис не верный.  
---------------------  
Как еще один вариант можно прописывать через код символа, хотя и не уверен что это поможет :(
Спасибо
 
{quote}{login=R Dmitry}{date=05.01.2012 06:45}{thema=}{post}Кирилл, добрый день или вечер :)  
Так он может recordset в массив загнать, а он же, не может его открыть, так как SQL синтаксис не верный.  
---------------------  
Как еще один вариант можно прописывать через код символа, хотя и не уверен что это поможет :({/post}{/quote}  
 
Почему не сможет? А SELECT * FROM на что? Другое дело - если база дюже большая, то тяжко будет.
KL
 
Теоретически, еще можно попробовать    
 
HDR=No  
 
и потом    
 
SELECT F1, F3, F10 FROM ...  
 
но боюсь, что если и сработает, то тип данных будет везде стринг (лишнюю строку потом отфильтровать - не проблема).
KL
 
Ну да если таблица одна а если много.... и большие...  
 
все же наверное лучший вариант положить VIEW
Спасибо
 
{quote}{login=R Dmitry}{date=05.01.2012 07:00}{thema=}{post}Ну да если таблица одна а если много.... и большие...  
 
все же наверное лучший вариант положить VIEW{/post}{/quote}  
 
Ну да, это если ты дружишь с DB админом :)
KL
 
{quote}{login=R Dmitry}{date=05.01.2012 07:00}{thema=}{post}Ну да если таблица одна а если много.... и большие...  
 
все же наверное лучший вариант положить VIEW{/post}{/quote}  
 
Спасибо всем за ответы - буду пробывать после праздников - надо добро у вышестоящих получить на VIEW - не я администрирую БД. Основная таблица БД с которой работаю - около 50 тыс. записей и 90 столбцов, из которых использую около 10. Хорошо что название этой таблицы без шведских букв :), хотя есть и такие. Остальные таблицы поменьше. Есть правда еще одно обращение к другой БД - там несколько миллионов записей, но 3 столбца и название по стандарту - проблем не возникает.  
Кроме того у меня еще задача, чтоб весь код не занимал много времени на обработку. Сейчас до 3 секунд в зависимости от ПК, максимум что можно позволить до 5-6 секунд.
 
Думал еще попробовать, как вариант, номера символов в названии полей БД вычислить и найти закономерность смещения номеров в зависимости от кодировки, но не хочется городить - ищу более "красивые" решения.
 
Попробовал через Recordset:  
Сделал запрос SELECT * FROM dbo.XXXXXXX WHERE (1 = 0)  
...  
Потом из этого запроса получаю названия полей  
Set FirstRecordset.Source = FirstCmd  
FirstRecordset.Open  
For Each fld In FirstRecordset.Fields  
   Debug.Print fld.Name  
Next  
Постоянно разная очередность и название коверкает, похоже но не то, например, вот так [Malat Intrullnr] - если сравнить с картинкой вторая буква без шапочки. Пошел дальше - при тупом копировании названия этого поля с SQL Servera получается при вставке в коде [M?lat Intrullnr] (сейчас я работаю под русской кодировкой). Может кто знает как здесь быть?
 
В порядке бреда можно попробовать конвертировать заголовки в запросе так:  
 
StrConv("text",vbFromUnicode)  
StrConv("text",vbUnicode)  
 
и даже так:  
 
Unihex$("text")  
 
Function Unihex$(s$)  
   Dim sr() As Byte, i&  
   sr = StrConv(s, 64)  
   For i = 0 To UBound(sr) Step 4  
       If sr(i + 2) Then  
           Unihex$ = Unihex$ & "\u0" & sr(i + 2) & LCase(Hex(sr(i)))  
       Else  
           Unihex$ = Unihex$ & Chr(sr(i))  
       End If  
   Next  
End Function
KL
 
{quote}{login=KL}{date=07.01.2012 12:31}{thema=}{post}В порядке бреда можно попробовать конвертировать заголовки в запросе так:  
 
StrConv("text",vbFromUnicode)  
StrConv("text",vbUnicode)  
 
и даже так:  
 
Unihex$("text")  
 
Function Unihex$(s$)  
   Dim sr() As Byte, i&  
   sr = StrConv(s, 64)  
   For i = 0 To UBound(sr) Step 4  
       If sr(i + 2) Then  
           Unihex$ = Unihex$ & "\u0" & sr(i + 2) & LCase(Hex(sr(i)))  
       Else  
           Unihex$ = Unihex$ & Chr(sr(i))  
       End If  
   Next  
End Function{/post}{/quote}  
 
Спасибо за попытку. К сожалению все 3 варианта не прошли конкурс :). 1-ый превращает все в ????, 2-ой расставляет пробелы между символами а шведский символ превращает непонятно во что, третий выдает, например, такой результат: "[M\u0435lat Intrullnr]". Тем не менее второй вариант оказался ближе всех к цели.
 
пробелы можно и удалить так же программно )
 
{quote}{login=}{date=10.01.2012 01:32}{thema=}{post}пробелы можно и удалить так же программно ){/post}{/quote}  
Можно конечно - перевести еще во что-то (еще какую-нибудть интерпритацию Юникода). Функция Trim пробелы не уберет, т.к. с пробелами должно быть. Все равно будет что-то типа того: [ M 5l a t I n t r u l l n r ] вместо [Målat Intrullnr].
 
Упс. К предыдущему коментарию дополнение. Как должно быть видно на картинке от 05.01.2012, 14:01, а то пишу одно - получаю третье.
 
Спасибо всем. Сегодня создали представление (VIEW) с "правильными" именами полей - это решение закрыло данную тему.
Страницы: 1
Читают тему
Наверх