ホームページ > バックエンド開発 > C++ > ファイルをバイト配列としてデータベースに保存するのが最も効率的な方法ですか?

ファイルをバイト配列としてデータベースに保存するのが最も効率的な方法ですか?

Susan Sarandon
リリース: 2025-01-15 09:31:48
オリジナル
566 人が閲覧しました

Is Storing Files as Byte Arrays in a Database the Most Efficient Method?

あらゆる形式のファイルをバイト配列としてデータベースに保存します

さまざまな形式でファイルをデータベースまたはディスクに保存するには、慎重な検討が必要です。一般的なアプローチは、保存する前にファイルをバイト配列に変換することです。この方法を使用すると、あらゆる形式のファイルを保存できますが、それが最良の方法であるかどうかという疑問が生じます。

このプロセスを説明するために、回答に記載されている次のコード スニペットを検討してください。

ファイルをバイト配列として SQL Server データベースに挿入します:

public static void databaseFilePut(string varFilePath) {
    byte[] file;
    using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) {
        using (var reader = new BinaryReader(stream)) {
            file = reader.ReadBytes((int) stream.Length);       
        }          
    }
    using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
    using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) {
        sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
        sqlWrite.ExecuteNonQuery();
    }
}
ログイン後にコピー

データベースからバイト配列としてファイルを取得します:

public static MemoryStream databaseFileRead(string varID) {
    MemoryStream memoryStream = new MemoryStream();
    using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
    using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
        sqlQuery.Parameters.AddWithValue("@varID", varID);
        using (var sqlQueryResult = sqlQuery.ExecuteReader())
            if (sqlQueryResult != null) {
                sqlQueryResult.Read();
                byte[] blob = new byte[(int)sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue)];
                sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                memoryStream.Write(blob, 0, blob.Length);
            }
    }
    return memoryStream;
}
ログイン後にコピー

MemoryStream を使用してファイルをバイト配列としてデータベースに挿入します:

public static int databaseFilePut(MemoryStream fileToPut) {
        int varID = 0;
        byte[] file = fileToPut.ToArray();
        const string preparedCommand = @"
                    INSERT INTO [dbo].[Raporty]
                               ([RaportPlik])
                         VALUES
                               (@File)
                        SELECT [RaportID] FROM [dbo].[Raporty]
            WHERE [RaportID] = SCOPE_IDENTITY()
                    ";
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) {
            sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;

            using (var sqlWriteQuery = sqlWrite.ExecuteReader())
                while (sqlWriteQuery != null && sqlWriteQuery.Read()) {
                    varID = sqlWriteQuery["RaportID"] is int ? (int) sqlWriteQuery["RaportID"] : 0;
                }
        }
        return varID;
    }
ログイン後にコピー

これらのコード スニペットは、ファイルをバイト配列に変換し、それを VARBINARY(MAX) 型のデータベース列に格納するプロセスを示しています。必要に応じて、ファイルをバイト配列として取得し、新しいファイルとして保存したり、アプリケーションにストリーミングしたりできます。

提供されたテキストはすでに非常に簡潔でよく書かれています。主な変更は、割り当て前にバイト配列の長さが整数に正しくキャストされなかったという databaseFileRead 関数の小さな問題を修正することです。その他の重要な変更はありません。元の意味と構造を維持しながら効果的な言い換えを行うために必要であると考えられました。

以上がファイルをバイト配列としてデータベースに保存するのが最も効率的な方法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート