ホームページ > バックエンド開発 > C++ > ファイルをバイト配列に変換することは、データベース ストレージの最適なソリューションですか?

ファイルをバイト配列に変換することは、データベース ストレージの最適なソリューションですか?

Patricia Arquette
リリース: 2025-01-15 08:56:44
オリジナル
633 人が閲覧しました

Is Converting Files to Byte Arrays the Optimal Solution for Database Storage?

ファイルをバイト配列に変換: データベース ストレージに最適なソリューション?

質問

ファイルをデータベースまたはディスクに保存するには、最も効率的で信頼性の高い方法を検討してください。 1 つの方法は、ファイルを保存する前にバイト配列に変換することです。この記事では、ファイルをバイト配列に変換することが、あらゆるファイル形式を保存するための最良の戦略であるかどうかを検討します。

説明

データベースストレージ用にファイルをバイト配列に変換することが適切かどうかは、使用される特定のデータベースによって異なります。たとえば、SQL Server では、VARBINARY(MAX) 列を使用してテーブルを作成すると、バイト配列を効率的に格納できます。

次の C# コードは、ファイルをドライブからデータベースに保存する方法を示しています。

<code class="language-csharp">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();
    }
}</code>
ログイン後にコピー

ファイルを取得してドライブに保存するには:

<code class="language-csharp">public static void databaseFileRead(string varID, string varPathToNewLocation) {
    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();
                var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                using (var fs = new FileStream(varPathToNewLocation, FileMode.Create, FileAccess.Write)) 
                    fs.Write(blob, 0, blob.Length);
            }
    }
}</code>
ログイン後にコピー

このメソッドにより、ファイルをメモリ ストリームとして取得できます:

<code class="language-csharp">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();
                var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
                sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
                memoryStream.Write(blob, 0, blob.Length);
            }
    }
    return memoryStream;
}</code>
ログイン後にコピー

最後に、メモリ ストリームをデータベースに挿入します。

<code class="language-csharp">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;
}</code>
ログイン後にコピー

結論

ファイルをバイト配列に変換すると、SQL Server の適切な VARBINARY(MAX) 列を使用して、任意の形式のファイルをデータベースまたはディスクに保存する効率的な方法になります。提供されているコード例は、データベース内のバイナリ ファイルの読み取りと書き込みのための包括的な実装を提供し、ファイルの信頼性の高い永続性と取得を保証します。

以上がファイルをバイト配列に変換することは、データベース ストレージの最適なソリューションですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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