1

テキスト ファイル (.aspx、.cs、html など) を SQL Server 2008 データベースにロードしようとしています。これまでのところ、64 kb 未満のすべてのファイルを読み込むことができます。2 つの質問があります。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 には 64 KB の制限はありません。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 固有の構文を使用して、ファイルをチャンクでロードし、各チャンクをデータベースに追加します。

textPS 一部の回答では、 、 、ntextなどの古い LOB タイプの使用が推奨されていますimage。これらの型は SQL Server 2008 では使用しないでください。非推奨であり、推奨されていません。

于 2009-09-28T05:56:12.553 に答える
0

VARCHAR/CHAR 列の代わりに TEXT 列を使用します。TEXT よりも大きなものが必要な場合、またはバイナリ ファイルでロードする場合は、BINARY/VARBINARY/IMAGE などを調べてください。

于 2009-09-28T00:25:49.757 に答える
0

MSDN では、利用可能なすべてのデータ型に関するドキュメントを提供しています。テキスト ファイルの場合は、おそらく TEXT タイプを使用することをお勧めします。バイナリ ファイルの場合は、Binary String タイプのいずれかを使用します。

于 2009-09-28T00:31:24.863 に答える
0

Phoebus の応答に加えて、作業バッファーが小さすぎる場合、または 64k より小さい場合は、最初のセグメントを読み取り、それでテキスト フィールドを更新し、別のバッファーを読み取り、テキスト + 新しいバッファーでテキストを更新し、それまで繰り返すことができます。すべてのデータが読み込まれました。

于 2009-09-28T00:32:28.917 に答える
0
  • データベースは、大きなファイルを保存するようには作られていません。代わりにファイルをハードディスクに保存し、ファイル名をデータベースに保存します。

  • とにかくそれらをデータベースに保存したい場合は、#ziplib のような圧縮ライブラリを使用してファイルサイズを小さくし (ソースコードは非常によく圧縮されます)、phoebus が提案するようなバイナリ列型を使用できます。

于 2009-09-28T00:34:28.490 に答える