如何加载大于64 kb buffersize限制的文本文件?

时间:2009-09-24 20:57:26

标签: c# asp.net sql-server

我正在尝试将文本文件(.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["SQL_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));

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

        reader.Close();
    }
}

3 个答案:

答案 0 :(得分:2)

在SQL Server 2008中,Microsoft添加了一种名为FileStream的新数据类型。它“通过将varbinary(max)二进制大对象(BLOB)数据存储为文件系统上的文件,将SQL Server数据库引擎与NTFS文件系统集成”。您可以阅读有关FileStream here的更多信息。

答案 1 :(得分:1)

你似乎做了很多额外的,不必要的工作 - 在某些地方出现问题。

我在这里使用此代码尝试了您的方案,它可以顺利运行 - 完全没有问题,即使对于超过500 KB的文本文件也是如此:

// read the whole text of the file in a single operation
// no filestream, memorystream and other messy stuff needed!
string file_content = File.ReadAllText(sourceFile);

Int32 file_length = content.Length;

// best practice: always put SqlConnection and SqlCommand into using() {..} blocks!
using (SqlConnection _con = new SqlConnection(CS))
{
   string _query =
      "INSERT INTO Page_File_Store (file_length, file_path, file_string) " + 
      "VALUES (@file_length, @file_path, @file_string)";

   using(SqlCommand _cmd = new SqlCommand(_query, _con))
   {
       // just add the three parameters with their values 
       // ADO.NET figures out the rest (datatypes etc.) by itself!
       _cmd.Parameters.AddWithValue("@file_length", file_length);
       _cmd.Parameters.AddWithValue("@file_path", fileName);
       _cmd.Parameters.AddWithValue("@file_string", content);

       _con.Open();
       _cmd.ExecuteNonQuery();
       _con.Close();
   }
}

那应该绝对有效 - 试试吧!

马克

答案 2 :(得分:0)

如果你替换它,它会解决你的问题:

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

有了这个:

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

-1被解释为(MAX)