当ncarchar(max)上限为4000个字符时,无法存储HTML页面

时间:2018-05-21 05:20:04

标签: c# sql-server nvarchar

简单来说,如何将nvarchar(MAX)的上限增加到实际容纳280MB的文本而不仅仅是8000MB(如果我错了,请纠正我)?

所以,对于我的决赛项目,我为一个想要自己的图书馆网站自定义搜索引擎的客户制作网络爬虫,但是当我尝试存储抓取工具检索到的信息时,我的问题就出现了。

特别是我遇到的问题是即使我设置了列#34; HTML"到nvarchar(MAX),它应该能够容纳2GB的数据,它不会保存任何信息,在这种情况下为280MB,因为它太长了。

我确实尝试缩短要保存的文本的长度,当我足够短时,它最终同意保存数据,所以我可以理解它的上限。

编辑:请求的代码示例

页面容器类:

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 :(得分:3)

nvarchar(max)类型允许存储最多2GB的数据。对于 n varchar,它意味着大约10亿个字符,因为N类型以每个字符的unicode 2字节存储文本。

  

nvarchar [(n | max)]

     

可变长度的Unicode字符串数据。 n 定义字符串长度   并且可以是1到4,000之间的值。 最大表示   最大存储大小为2 ^ 30-1个字符。最大存储大小   字节数为2 GB。实际存储大小(以字节为单位)是两倍   输入的字符数+ 2个字节。

很可能你的问题出现在试图插入这么大的文本的过程中的某个地方。首先想到的是一些超时。将280MB数据上传到服务器需要一段时间,因此请检查故障的详细信息(查看错误消息和异常)以收集出现问题的线索。

很少有事情要检查:

仔细检查数据库中HTML列的类型。

也许SSMS没有正确显示长值。尝试运行

SELECT LEN(HTML) FROM YourTable

验证存储字符串的长度。

总的来说,只需逐步调试调试器中的代码,并验证所有变量都具有预期值。