1

我正在尝试将文本文件(.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。 如何加载大于 64 kb 缓冲区大小限制的文本文件?

4

5 回答 5

1

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

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

PS 一些回复建议使用旧的 LOB 类型,如text,ntextimage. 不要在 SQL Server 2008 中使用这些类型,它们已被弃用和劝阻。

于 2009-09-28T05:56:12.553 回答
0
  • 数据库不是用来存储大文件的。将文件存储在硬盘上,并将文件名存储到数据库中。

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

于 2009-09-28T00:34:28.490 回答
0

MSDN 提供有关所有可用数据类型的文档。对于文本文件,您可能希望使用 TEXT 类型,对于二进制文件,请使用 Binary String 类型之一。

于 2009-09-28T00:31:24.863 回答
0

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

于 2009-09-28T00:32:28.917 回答
0

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

于 2009-09-28T00:25:49.757 回答