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

画像をvarbinary(max)列に保存する方法は?

    これを使用して、ファイルをバイト配列に読み込みます:

        // Old fashioned way
        public static byte[] ReadFile(string filePath)
        {
            byte[] buffer;
            FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            try
            {
                int length = (int)fileStream.Length;  // get file length
                buffer = new byte[length];            // create buffer
                int count;                            // actual number of bytes read
                int sum = 0;                          // total number of bytes read
    
                // read until Read method returns 0 (end of the stream has been reached)
                while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
                    sum += count;  // sum is a buffer offset for next reading
            }
            finally
            {
                fileStream.Close();
            }
            return buffer;
        }
    

    または

        // Thanks Magnus!
        byte[] data = System.IO.File.ReadAllBytes(filePath);
    

    次に、これを使用して画像データを保存します(instance.Dataに画像情報とバイト配列を含む画像クラス「インスタンス」を使用しています):

       using(SqlCommand cm = new SqlCommand("SaveImage", connection, transaction)){
           cm.CommandType = CommandType.StoredProcedure;
           cm.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int,0, ParameterDirection.InputOutput, false, 10, 0, "Id", DataRowVersion.Current, (SqlInt32)instance.Id));
           cm.Parameters.Add(new SqlParameter("@Title", SqlDbType.NVarChar,50, ParameterDirection.Input, false, 0, 0, "Title", DataRowVersion.Current, (SqlString)instance.Title));
           if (instance.Data.Length > 0)
           {
               cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,instance.Data.Length, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, (SqlBinary)instance.Data));
           }
           else
           {
               cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,0, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, DBNull.Value));                    
           }
    
           cm.ExecuteNonQuery();
       )
    

    そして、ここにストアドプロシージャの例があります:

    CREATE PROCEDURE SaveImage
    (
    @Id int OUTPUT 
    ,@Title nvarchar(50)
    ,@Data varbinary(MAX)
    )
    AS
    SET NOCOUNT ON
    SET XACT_ABORT ON
    
    IF @Id IS NULL OR @Id <= 0
    BEGIN
    SELECT @Id = ISNULL(MAX([Id]),0) + 1 FROM [dbo].[Images]
    END
    
    INSERT INTO [dbo].[Images] (
    [Id]
    ,[Title]
    ,[Data]
    ) VALUES (
    @Id
    ,@Title
    ,@Data
    )
    


    1. レコードメンテナンスの概要

    2. DB2からPostgreSQLへの移行-知っておくべきこと

    3. データベースとファイルシステムへのファイルの保存

    4. MySQLで数値の範囲を生成する