Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
Всем привет! Столкнулся с проблемой русских символов в ответа на запрос из .net приложения. Суть: Приложение генерирует запрос -
Запрос выполняется при помощи метода SqlCommand.ExecuteScalar(), так же можно SqlDataAdapter.Fill(какая ни-нибудь таблица) В обоих случаях в ответ получаю - ?????? Однако, если текст запроса будет -
В ответ получаю - Привет Кто-нибудь знает почему так получается?
Collation сервера - Cyrillic_General_CI_AS Collation базы данных - Cyrillic_General_CI_AS И на всякий случай проверил Collation tempdb - Cyrillic_General_CI_AS |
|||
5 мар 15, 10:49 [17345444] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Maksym_t, Вывод зависит от того в контексте какой базы вы этот запрос выполняете. Проверьте еще раз скорее всего неправильно посмотрели коллашен базы либо сервера. для проверки select databasepropertyex(db_name(), 'collation') DECLARE @tbl TABLE(MESS VARCHAR(10) COLLATE Cyrillic_General_CI_AS); INSERT INTO @tbl VALUES('Привет'); SELECT MESS FROM @tbl; |
5 мар 15, 11:11 [17345577] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
WarAnt, Выполнил из приложения select databasepropertyex(db_name(), 'collation') Получил из приложения: Cyrillic_General_CI_AS К сообщению приложен файл. Размер - 4Kb |
5 мар 15, 11:21 [17345628] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
какая неделя кириллическая :) коллэйшен TempDB ни при чем, столбцы табличной переменной получают либо коллэйшен базы, если явно не указать, либо явно указанный. Maksym_t, первый запрос у вас выполняется в контексте некириллической базы, оттуда и вопросики. передавайте кириллицу юникодом: INSERT INTO @tbl VALUES(N'Привет'); |
5 мар 15, 11:22 [17345633] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ну так надо в тот запрос, что вопросики выдает, вписать опрос коллэйшена, а то спасибо, в разных базах выполняете DECLARE @tbl TABLE(MESS VARCHAR(10) COLLATE Cyrillic_General_CI_AS); INSERT INTO @tbl VALUES('Привет'); SELECT MESS, databasepropertyex(db_name(), 'collation') FROM @tbl; |
5 мар 15, 11:24 [17345651] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
o-o, С этой бедой 2-ой день не знаю чего делать. То, что вы предложили тоже пробовал, понять не могу в чем тут дело. На всякий случай, запускаю из приложения: DECLARE @tbl TABLE(MESS VARCHAR(10) COLLATE Cyrillic_General_CI_AS); INSERT INTO @tbl VALUES(N'Привет'); SELECT MESS,databasepropertyex(db_name(), 'collation') AS [collation] FROM @tbl; И все равно в ответ получаю, одни вопросы. К сообщению приложен файл. Размер - 5Kb |
5 мар 15, 11:32 [17345710] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
из SSMS результат нормально выводится? |
||
5 мар 15, 11:40 [17345755] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
может, у вас случай, обратный вот этому? Проблема с кодировкой русских букв после переноса базы и 1251 перекодируется по правилам 1252??? вряд ли. можно: отследить профайлером, что идет на сервер; попробовать выполнить из студии; сменить тип колонки на юникодный и тогда уж точно никаких больше вопросиков DECLARE @tbl TABLE(MESS NVARCHAR(10) COLLATE Cyrillic_General_CI_AS); INSERT INTO @tbl VALUES(N'Привет'); SELECT MESS FROM @tbl; |
5 мар 15, 11:42 [17345769] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
Knyazev Alexey, Да, в SSMS все отлично. |
5 мар 15, 11:44 [17345784] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ну так приложение или криво шлет, или криво отображает. смотрите профайлером, что шлет |
||
5 мар 15, 11:47 [17345817] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
o-o, Нужно почитать, что такое профайлер, и как им пользоваться. Не приходилось его использовать. По второй части, с NVARCHAR(), тоже пробовал, там вообще красота выходит. К сообщению приложен файл. Размер - 5Kb |
5 мар 15, 11:48 [17345825] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
так тут 100% ваше приложение коряво написано! правьте его... SSMS - это тоже всего лишь обычное приложение, но оно, в отличии от вашего, написано верно |
||
5 мар 15, 11:54 [17345867] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ну хорошо, давайте выведем байтики:SELECT MESS, cast(mess as varbinary(100)) |
5 мар 15, 11:54 [17345868] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
Knyazev Alexey, Так как мое приложение может быть криво написано, если я использую методы, написанные Microsoft. В первом сообщение написал, какими методами получаю, данные из БД, или вы хотите сказать, что есть какие-то волшебные настройки в строке подключения, позволяющие корректировать ответные данные из разных источников (типы таблиц) внутри одного экземпляра SQL? |
5 мар 15, 11:56 [17345895] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ответные данные правильные, просто кто-то их некорректно выводит. вы байты-то покажите, если одинаковые, то программа перед выводом корежит, а если разные, то сама форма не в состоянии отобразить |
5 мар 15, 12:02 [17345926] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
o-o, К сожалению, встроенный в VS2008 менеджер просмотра данных DataTable показывает System.Byte[] в столбце с массивом байтов/ Если значение ячейки в которой должен быть массив байтов преобразовать к переменной типа Byte() Dim bytes() As Byte = CType(DT.Rows(0).Item(1), Byte()) То в bytes будет следующее содержание: 253,255,253,255,253,255,253,255,253,255,253,255 В SSMS показывает 0x1F0440043804320435044204 На каком моменте происходит конвертация не понятно, так как при запросе из "Не временной" таблицы, все отображается корректно. %) |
5 мар 15, 12:15 [17346005] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
Maksym_t, Это для NVARCHAR который выдает, символы в виде, карт. Если Столбец в SQL будет VARCHAR то массив следующий: 63,63,63,63,63,63 в SSMS: 0xCFF0E8E2E5F2 |
5 мар 15, 12:19 [17346025] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
хотите сказать, что нельзя вывести в форму результат этого кода?
|
||
5 мар 15, 12:19 [17346027] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
o-o, При отладке, просматриваю содержимое объекта DT типа DataTable в VS2008 используется класс System.Data.DataView Который отображает менеджер, в котором можно выбрать, конкретную таблицу из набора данных (DataSet), в данном случае таблица одна, выбирать нечего. И в этом самом менеджере просмотра, массив байтов не отображается =) К сообщению приложен файл. Размер - 29Kb |
5 мар 15, 12:29 [17346084] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
вас уже 2 раза просили показать результат запроса:SELECT MESS, cast(mess as varbinary(100)) |
5 мар 15, 12:40 [17346155] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
Разобрался, есть еще одна тонкость, о которой не упомянул. Запрос храниться на диске, приложение его считывает с диска и запускает на выполнение. Во время считывания, и происходит корректировка, получается что, запрос уже выполняется со знаками ?????? в место русских символов. Как я так затупил... Искреннее спасибо, всем кто предлагал варианты решения. |
5 мар 15, 12:56 [17346272] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
|
||||
5 мар 15, 13:05 [17346343] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
Knyazev Alexey, Ради прикола, вот метод который считывал файл.
Dim reader As New StreamReader(nameFile)
GetFileFromFileSystem = reader.ReadToEnd()
А, что пришлось сделать, чтобы все работало корректно
Dim reader As New StreamReader(nameFile, Encoding.Default)
GetFileFromFileSystem = reader.ReadToEnd()
По логике Microsoft, при чтении файла, не указав кодировку "По умолчанию", он будет выбирать ее "наугад", или у него есть еще какое-то месть "Еще более по умолчанию" =))))) Ну вот ни как не ожидал такого подвоха. |
5 мар 15, 13:09 [17346386] Ответить | Цитировать Сообщить модератору |
Arm79 Member Откуда: МО, Раменское Сообщений: 3692 |
Наугад вы пишите приложения. А в документации четко написано, что кодировка по умолчанию utf-8. Encoding.Default для вас скорее всего windows-1251 |
||
5 мар 15, 15:21 [17347478] Ответить | Цитировать Сообщить модератору |
Maksym_t Member Откуда: Екатеринбург Сообщений: 29 |
Arm79, В этой жизни много чего делаю на угад. Даже когда нажимаю на педаль тормоза, у меня нет 100% уверенности, что я остановлюсь. В силу того, что я не знаю насколько шероховат асфальт, не пробьет ли мне резину и многое-многое другое. В общем случае я опираюсь на опыт и предсказания, что позволяет мне в абсолютно большинстве случаев остановится там, где и планировал. Вот и в данном случае я опирался на элементарную логику, если не указать, кодировку, то будет выбрана по умолчанию. Однако чем руководствовались Майкрософт, когда делали выбор в пользу утф вместо по умолчанию, ни как не пойму. Их логику мне вообще последнее время достаточно сложно понять. Да, я не прочитал полностью документацию по данному методу, ошибка моя. |
5 мар 15, 23:06 [17349826] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |