sql >> データベース >  >> RDS >> Sqlserver

ファイルをデータベースに保存する方法は?

    このソリューションは、SQL SERVER 2005/2008 で機能します。

    VARBINARY(MAX) でテーブルを作成する必要があります 柱の一つとして私の場合、テーブル Raporty を作成しました 列 RaportPlik を使用 VARBINARY(MAX) であること

    以下に、必要に応じて変更できるいくつかのサポート機能があります:

        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 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);
                    }
            }
        }
        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);
                        //using (var fs = new MemoryStream(memoryStream, FileMode.Create, FileAccess.Write)) {
                        memoryStream.Write(blob, 0, blob.Length);
                        //}
                    }
            }
            return memoryStream;
        }
    

    最初の方法はファイルをドライブからデータベースに入れる方法、2 番目の方法はファイルを取得してドライブに保存する方法、3 番目の方法はデータベースからファイルを取得して MemoryStream として置く方法です。 そのため、ドライブに書き込むだけで他のことができます。

    この 4 番目の方法は、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;
        }
    


    1. ClusterControl1.8.2の新しいユーザーとLDAP管理

    2. DATEとしてのMySQLCAST

    3. 無効なXML形式-これを回避する方法

    4. MySQLdbモジュールのロード中にエラーが発生しました'mysqlclientまたはMySQL-pythonをインストールしましたか?'