如何将文本文件加载到大于64 kb缓冲区大小限制的数据库中?

时间:2009-09-28 00:18:59

标签: c# sql-server filestream streamreader

我正在尝试将文本文件(.aspx,.cs,html等)加载到sql server 2008数据库中。到目前为止,我能够加载所有小于64 kb的文件。我有两个问题;如何绕过64 kb的限制,这是我使用最佳方法的方法?

感谢您的帮助。

数据库:

    file_length int,
    file_path varchar(250),
    file_string varchar(MAX)


private static void Load_Files()
{
    string source = HttpContext.Current.Server.MapPath("~/website/");

    DirectoryInfo di = new DirectoryInfo(source);
    FileInfo[] files = di.GetFiles();

    foreach (FileInfo f in files)
    {
        string sourceFile = f.FullName;

        FileStream fs_reader = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);
        StreamReader reader = new StreamReader(fs_reader);
        string content = reader.ReadToEnd();

        Int32 file_length = content.Length;

        string CS = ConfigurationManager.ConnectionStrings["MCP_CS"].ConnectionString;
        SqlConnection SQL_Conn_01 = new SqlConnection(CS);

        string SQL_01 = "INSERT INTO Page_File_Store (file_length, file_path, file_string) VALUES (@file_length, @file_path, @file_string)";
        SqlCommand SQL_File_Load = new SqlCommand(SQL_01, SQL_Conn_01);
        SQL_File_Load.Parameters.Add(new SqlParameter("@file_length", file_length));
        SQL_File_Load.Parameters.Add(new SqlParameter("@file_path", sourceFile));

        //SQL_File_Load.Parameters.Add(new SqlParameter("@file_string", content));

        SqlParameter contentParameter = new SqlParameter("@file_string", SqlDbType.VarChar, -1);
        contentParameter.Value = content;
        SQL_File_Load.Parameters.Add(contentParameter);

        SQL_Conn_01.Open();
        SQL_File_Load.ExecuteNonQuery();
        SQL_Conn_01.Close();

        reader.Close();
    }
}

}

请注意:这是我之前提出的问题的副本,并且在我清除Cookie时失去了控制权。 How do I load text files greater than the 64 kb buffersize limit?

5 个答案:

答案 0 :(得分:1)

SQL Server中没有64kb的限制。对于行内数据类型(char,varchar,nchar,nvarchar,binary和varbinary),SQL字符串的限制为8000字节;对于LOB类型,限制为2 GB(varchar(max),nvarchar(max)和varbinary(max) )。您看到的64 kb限制必须来自其他内容,最有可能来自IIS上载或ASP或CLR处理限制。

但是你不能像这样处理任意长度的文件。 .Net不会使用Stream.ReadToEnd()将大型流加载到字符串中,因为内存分配不会成功。您将以块的形式加载文件,并使用特定于LOB的UPDATE table SET column.WRITE...语法将每个块附加到数据库中。

P.S。有些回复建议使用旧的LOB类型,例如textntextimage。不要将这些类型与SQL Server 2008一起使用,不推荐使用它们。

答案 1 :(得分:0)

使用TEXT列而不是VARCHAR / CHAR列。如果你需要比TEXT更大的东西,或者将加载二进制文件,请查看BINARY / VARBINARY / IMAGE等。

答案 2 :(得分:0)

MSDN提供有关all of the available data types的文档。对于文本文件,您可能希望使用TEXT类型,因为二进制文件使用其中一种二进制字符串类型。

答案 3 :(得分:0)

除了phoebus的响应,如果你的工作缓冲区太小,甚至小于64k,你可以读取第一段,用它更新文本字段,读取另一个缓冲区并用文本+新缓冲区更新文本并重复,直到加载所有数据。

答案 4 :(得分:0)

  • 数据库不用于存储大文件。将文件存储在硬盘上,并将文件名存储到数据库中。

  • 如果您仍想将它们存储到数据库中,您可以使用#ziplib之类的压缩库来减小文件大小(源代码压缩得很好)并使用像phoebus建议的二进制列类型。