Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

В БД кириллица записывается как “?????”

#c_sharp #база_данных #aspnet_mvc #entity_framework


Сделал регистрацию на сайте asp.net MVC 5, с использованием EF. При добавлении строки
в таблицу, поле с кириллицей записывается как "?????".

Столбец типа NVARCHAR(100), так что проблема не в БД. На HTML-странице использую
UTF-8 кодировку, как и файл этого контроллера и самой страницы. Выводит из БД русский
текст тоже без проблем.

Может, проблема в самом сервере? Или что-то добавить в Web.config?
Пробовал добавлять в connectionStrings параметр charset=utf8 в разные места, ловил
исключения:


The underlying provider failed on ConnectionString.
Keyword not supported: 'charset'.


Установлена английская Visual Studio Enterprise 2015 (v.14.0.25420.01 Update 3).
В настройках проекта: Neutral Language: Russian (Russia)




Код страницы:

@model HotelSystem.hs_users

@{
    Layout = null;
}




    
    
    HotelSystem - Регистрация
    @Scripts.Render("~/bundles/modernizr")
    
    


    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryval")
    @Html.Partial("_Header")
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        

Создание аккаунта

@Html.EditorFor(model => model.username, new { htmlAttributes = new { @placeholder = "Логин" } }) @Html.ValidationMessageFor(model => model.username, "", new { @class = "text-danger" }) @Html.EditorFor(model => model.email, new { htmlAttributes = new { @placeholder = "Email" } }) @Html.ValidationMessageFor(model => model.email, "", new { @class = "text-danger" }) @Html.EditorFor(model => model.password, new { htmlAttributes = new { @placeholder = "Пароль" } }) @Html.ValidationMessageFor(model => model.password, "", new { @class = "text-danger" }) @Html.EditorFor(model => model.confirmPassword, new { htmlAttributes = new { @placeholder = "Подтверждение пароля" } }) @Html.ValidationMessageFor(model => model.confirmPassword, "", new { @class = "text-danger" }) @Html.EditorFor(model => model.fullname, new { htmlAttributes = new { @placeholder = "Полное имя" } }) @Html.ValidationMessageFor(model => model.fullname, "", new { @class = "text-danger" })
} @Scripts.Render("~/bundles/bootstrap") Код контроллера: using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; namespace HotelSystem.Controllers { public class userController : Controller { HotelSystemDatabaseEntities1 db = new HotelSystemDatabaseEntities1(); ... public ActionResult register() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult register(hs_users U) { if (ModelState.IsValid) { U.role = 1; U.time = DateTime.Now; db.hs_users.Add(U); db.SaveChanges(); ModelState.Clear(); U = null; return RedirectToAction("index", "home"); } return View(U); } [HttpPost] public JsonResult doesUserNameExist(string username) { int user = 0; try { user = db.hs_users.Count(u => u.username == username); } catch { } if (user == 0) { return Json(true); } else { return Json(false); } } [HttpPost] public JsonResult doesEmailAddressExist(string email) { int user = 0; try { user = db.hs_users.Count(u => u.email == email); } catch { } if (user == 0) { return Json(true); } else { return Json(false); } } } } Код модели: namespace HotelSystem { using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web.Mvc; public partial class hs_users { public long ID { get; set; } [Required(ErrorMessage = "Заполните поле")] [Remote("doesUserNameExist", "user", HttpMethod = "POST", ErrorMessage = "Такой логин уже зарегистрирован")] [RegularExpression(@"^(?!.*\.\.)(?!.*\.$)[^\W][\w.]{2,49}$", ErrorMessage = "Некорректный логин")] public string username { get; set; } [Required(ErrorMessage = "Заполните поле")] [StringLength(50, ErrorMessage = "Пароль должен быть от {2} до {1} символов", MinimumLength = 6)] [DataType(DataType.Password)] public string password { get; set; } [Required(ErrorMessage = "Заполните поле")] [System.Web.Mvc.Compare("password", ErrorMessage = "Введенные пароли не совпадают")] [DataType(DataType.Password)] public string confirmPassword { get; set; } [Required(ErrorMessage = "Заполните поле")] public string fullname { get; set; } [Required(ErrorMessage = "Заполните поле")] [Remote("doesEmailAddressExist", "user", HttpMethod = "POST", ErrorMessage = "Такой Email уже зарегистрирован")] [EmailAddress(ErrorMessage = "Введите корректный Email")] public string email { get; set; } public System.DateTime time { get; set; } public int role { get; set; } } } Connection string из файла Web.config:


Ответы

Ответ 1



EF кэширует модель базы в момент рефреша. У вас в Model1.edmx/edmx:StorageModels написано следующее: И это заставляет EF криво мапить данные. Рефреш модели на основе базы решает проблему.

Ответ 2



Если в запросе задается юникодная константа, то перед ней нужно обязательно ставить символ N. Чтобы показать разницу, достаточно простого запроса: SELECT '致死罪 ANSI', N'致死罪 UNICODE' ??? ANSI 致死罪 UNICODE Если не указывать N перед константой, то SQL Server будет пытаться искать подходящий символ в ANSI кодировке. Если не найдет, то подставит знак вопроса.

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

Отправить комментарий