не может хранить HTML-страницу, когда ncarchar (max) ограничен 4000 символами - PullRequest
0 голосов
/ 21 мая 2018

Проще говоря, как увеличить ограничение nvarchar (MAX), чтобы оно содержало 280 МБ текста, а не только 8000 МБ (поправьте меня, если я ошибаюсь)?

Итак, для моего финального проектаЯ делаю веб-сканер для клиента, который хочет иметь собственную настраиваемую поисковую систему для своего библиотечного веб-сайта, но моя проблема возникает, когда я пытаюсь сохранить информацию, полученную сканерами.

В частности, проблема, с которой я столкнулсяявляется то, что даже если я установлю для столбца "HTML" значение nvarchar (MAX), которое должно содержать 2 ГБ данных, оно не сохранит никакой информации, в данном случае 280 МБ, потому что это слишком долго.

Я попытался сократить длину сохраняемого текста, и когда я сделал его достаточно коротким, он наконец согласился сохранить данные, поэтому, насколько я понимаю, они ограничены.

РЕДАКТИРОВАТЬ: Кодпримеры по запросу

класс контейнера страницы:

public class Page
{
    public int ID = -1;
    public String URL;
    public String HeadLine;
    public List<String> Tags;
    public String Description;
    public String HTML;
    public DateTime lastUpdate;
}

Фрагмент кода, когда сканер сохраняет найденную страницу:

//Save Page content to Database
Page page = new Page();
page.URL = url;
page.HeadLine = headline;
page.Tags = tags.Split(',').Where(s => !string.IsNullOrWhiteSpace(s)).ToList();
page.Description = description;
page.HTML = HTML;
page.lastUpdate = DateTime.Today;
new DBpage(Settings.instance.DBaddress,
Settings.instance.DBname).SavePage(page);

Метод, используемый для храненияЗвоните данные:

public void SavePage(Page page) {
    String SqlString = "";

    //Check is a page by the given URL already exists in the database and assign the SQL string acordingly
    Page foundPage = GetPage(page.URL); 
    if(foundPage == null) {
        SqlString = "INSERT INTO WebContent " +
                    "VALUES (@URL, @HeadLine, @Tags, @Description, @HTML, @LastUpdate)";
    }
    else {
        SqlString = "UPDATE WebContent " +
                    "SET URL = @URL, HeadLine = @HeadLine, Tags = @Tags, Description = @Description, HTML = @HTML, LastUpdate = @LastUpdate " +
                    //"SET URL = '" + page.URL + "', HeadLine = '" + page.HeadLine + "', Tags = '" + String.Join(",", page.Tags) + "', Description = '" + page.Description + "', HTML = '" + page.HTML.Replace("'", "''") + "', LastUpdate = " + page.lastUpdate + " " +
                    "WHERE ID = " + foundPage.ID;
    }

    //Assign all variables and execute the SQL
    try {
        using(DBaccess db = new DBaccess(dblocation, dbname)) {
            String html = page.HTML.Replace("'", "''"); //Replace all single quotes with double "single quotes" to escape the first single quote. 
            SqlCommand sqlCmd = db.GetSqlCommand(SqlString);
            sqlCmd.Parameters.AddWithValue("@URL", page.URL);
            sqlCmd.Parameters.AddWithValue("@HeadLine", page.HeadLine);
            sqlCmd.Parameters.AddWithValue("@Tags", String.Join(",", page.Tags));
            sqlCmd.Parameters.AddWithValue("@Description", page.Description);
            sqlCmd.Parameters.AddWithValue("@HTML", html);
            sqlCmd.Parameters.AddWithValue("@LastUpdate", page.lastUpdate);
            sqlCmd.ExecuteNonQuery();
        }
    }
    catch(SqlException e) {
        Console.WriteLine(e.Message);
    }
}

Печальный результат, который меня озадачивает: HTML is missing from this table

1 Ответ

0 голосов
/ 21 мая 2018
Тип

nvarchar(max) позволяет хранить до 2 ГБ данных.Для n varchar это означает около 1 миллиарда символов, поскольку типы N хранят текст в 2 байтах на символьный юникод.

nvarchar [(n | max)]

Строковые данные Unicode переменной длины. n определяет длину строки и может принимать значение от 1 до 4000. max указывает, что максимальный размер хранилища составляет 2 ^ 30-1 символов.Максимальный размер хранилища в байтах составляет 2 ГБ.Фактический размер хранилища в байтах в два раза превышает количество введенных символов + 2 байта.

Скорее всего, ваша проблема где-то в процедуре, которая пытается вставить такой большой текст.Первое, что приходит на ум, это некоторое время ожидания.Загрузка 280 МБ данных на сервер займет некоторое время, поэтому изучите подробности сбоя (просмотрите сообщения об ошибках и исключения), чтобы собрать подсказки о том, что идет не так.


Несколько вещей дляcheck:

Дважды проверьте тип столбца HTML в базе данных.

Возможно, SSMS неправильно отображает длинное значение.Попробуйте запустить

SELECT LEN(HTML) FROM YourTable

, чтобы проверить длину сохраненной строки.

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

...