Сохраняется текст с неправильной кодировкой
От: vgrigor  
Дата: 14.04.10 07:28
Оценка:
Поле в базе типа varchar (MS SQl Server), из него сгенерен Linq DataContext,
на котором работает DynamicData таблица ASP.NET 4.0.

Когда я ввожу в поле редактирования русские символы, то они отображаются в базе в виде символов вопроса ?, и в дальней шем на сайте то же.

как я пробовал скорректировать это

в файле web.config:
<globalization
fileEncoding="windows-1251"
requestEncoding="windows-1251"
responseEncoding="windows-1251"
culture="ru-RU"
uiCulture="ru-RU"
/>

in the master page header:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

сохранял файл мастер — страницы и шаблона таблицы в windows-1251 encoding.

Порбовал тоже с utf-8, тоже не работает,
работает если только в базе поставить тип nvarchar()

Вопрос соответсвенно такой — Как сделать корректное сохранение из форм через Linq для типа varchar() ?
Винтовку добудешь в бою!
Re: Сохраняется текст с неправильной кодировкой
От: Neco  
Дата: 14.04.10 12:52
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Вопрос соответсвенно такой — Как сделать корректное сохранение из форм через Linq для типа varchar() ?

а если ручками из ManagementStudio сделать апдейт с кириллицей — сохраняет?

оффтопик:
имхо, использовать win-1251 на уровне БД — плохо. Рано или поздно словите проблему. Перекодировка может происходить на уровне приложения, на уровне клиента ms sql (в зависимости от региональных настроек), на стороне сервера (опять же в зависимости от региональных настроек).
Лучше использовать юникод.

Зная оракл могу сказать, что там varchar2 тоже может быть юникодным. Т.е. при создании БД просто говорите, что мол varchar2 у меня будет ANSI, а nvarchar2 будет UTF-8. Но можно настроить и наоборот при желании.
В MS SQL я думаю та же история — соот-но можно на уровне БД сделать настройку, чтобы varchar было юникодным и никогда не испытывать проблем.
всю ночь не ем, весь день не сплю — устаю
Re[2]: Сохраняется текст с неправильной кодировкой
От: vgrigor  
Дата: 14.04.10 13:33
Оценка:
N>имхо, использовать win-1251 на уровне БД — плохо. Рано или поздно словите проблему. Перекодировка может происходить на уровне приложения, на уровне клиента ms sql (в зависимости от региональных настроек), на стороне сервера (опять же в зависимости от региональных настроек).
N>Лучше использовать юникод.

N>Зная оракл могу сказать, что там varchar2 тоже может быть юникодным. Т.е. при создании БД просто говорите, что мол varchar2 у меня будет ANSI, а nvarchar2 будет UTF-8. Но можно настроить и наоборот при желании.

N>В MS SQL я думаю та же история — соот-но можно на уровне БД сделать настройку, чтобы varchar было юникодным и никогда не испытывать проблем.

Интересно конечно, но таких механизмов в SQL server я не знаю.

Как правило берется готовая структура которая используется много где,
и к ней генерится новое приложение,
поэтому важно корректно сохранять именно то что вводится.

Что еще интересное, если я ввожу значение через комбобоксы где значения взятые из базы на русском,
то все сохраняется корректно,
а вот если через text-edit то некорректно.
Винтовку добудешь в бою!
Re[3]: Сохраняется текст с неправильной кодировкой
От: Neco  
Дата: 14.04.10 15:55
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Что еще интересное, если я ввожу значение через комбобоксы где значения взятые из базы на русском,

V>то все сохраняется корректно,
V>а вот если через text-edit то некорректно.
а, ну значит поля способны хранить кириллицу — это главное.
"через комбобоксы" — это как?
а если из кода сделать update — нормально отображаться будет? попробуйте в двух вариациях — через linq и напрямую SqlCommand.
всю ночь не ем, весь день не сплю — устаю
Re[4]: Сохраняется текст с неправильной кодировкой
От: vgrigor  
Дата: 14.04.10 16:06
Оценка:
V>>Что еще интересное, если я ввожу значение через комбобоксы где значения взятые из базы на русском,
V>>то все сохраняется корректно,
V>>а вот если через text-edit то некорректно.
N>а, ну значит поля способны хранить кириллицу — это главное.
N>"через комбобоксы" — это как?

Для обычного поля ASP.NET (4.0 DynamicData http://www.developers.org.ua/archives/jony/2009/07/20/asp-net-dynamic-data/)
сама генерит текстовый контрол, а для FK, — комбобокс, которые заполняет из parent таблицы.
конечно можно вместо этих контролов подставлять и свои, или даже их наборы.

N>а если из кода сделать update — нормально отображаться будет? попробуйте в двух вариациях — через linq и напрямую SqlCommand.

Попробую перехватить операцию update() заодно посмотрю что там в поле лежит.
Винтовку добудешь в бою!
Re[5]: Сохраняется текст с неправильной кодировкой
От: Neco  
Дата: 14.04.10 16:13
Оценка:
Здравствуйте, vgrigor, Вы писали:

N>>а если из кода сделать update — нормально отображаться будет? попробуйте в двух вариациях — через linq и напрямую SqlCommand.

V>Попробую перехватить операцию update() заодно посмотрю что там в поле лежит.
я имел в виду просто написать:
var cmd = new SqlCommand("update table set name=@name where id=@id",conn);
cmd.Parameters.Add(new SqlParameter("id", тип=int, 1));
cmd.Parameters.Add(new SqlParameter("name", тип=varchar, "мама мыла раму"));
cmd.executenonquesry();

и посмотреть, что получится.
всю ночь не ем, весь день не сплю — устаю
Re[6]: Сохраняется текст с неправильной кодировкой
От: vgrigor  
Дата: 15.04.10 09:18
Оценка:
N>я имел в виду просто написать:
N>
N>var cmd = new SqlCommand("update table set name=@name where id=@id",conn);
N>cmd.Parameters.Add(new SqlParameter("id", тип=int, 1));
N>cmd.Parameters.Add(new SqlParameter("name", тип=varchar, "мама мыла раму"));
N>cmd.executenonquesry();
N>

N>и посмотреть, что получится.

запись вручную тоже пишет ???? вместо символов,
пока не разобрался в чем дело.
Винтовку добудешь в бою!
Re[6]: Сохраняется текст с неправильной кодировкой
От: vgrigor  
Дата: 15.04.10 09:28
Оценка:
причем пишет верно если поставить в команде у поля тип Nvarchar, а в базе не менять тип
N>cmd.Parameters.Add(new SqlParameter("name", тип=Nvarchar, "мама мыла раму"));
Винтовку добудешь в бою!
Re[7]: Сохраняется текст с неправильной кодировкой
От: vgrigor  
Дата: 15.04.10 09:55
Оценка:
V>причем пишет верно если поставить в команде у поля тип Nvarchar, а в базе не менять тип
N>>cmd.Parameters.Add(new SqlParameter("name", тип=Nvarchar, "мама мыла раму"));

еще поправка:
надо еще в базе collation поменять у полей varchar на
COLLATE Cyrillic_General_CI_AS NULL
Винтовку добудешь в бою!
Re[8]: Сохраняется текст с неправильной кодировкой
От: vgrigor  
Дата: 15.04.10 15:27
Оценка:
V>еще поправка:

и еще поправка, (может я не так выразился):
все работает если в дизайнере Linq у поля поставить тип nVarChar, и collation у поля в базе Windows-1251,
а тип поля можно оставить varchar
Винтовку добудешь в бою!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.