web-dev-qa-db-ja.com

C#を使用してデータベースに画像を保存する方法

ユーザーイメージをC#のデータベースに保存したい。それ、どうやったら出来るの?

28
r.r

SQL BLOB列に格納できるバイナリ形式に画像をシリアル化する必要があります。 SQL Serverを使用していると仮定すると、この件に関する良い記事があります。

http://www.eggheadcafe.com/articles/20020929.asp

4
Dave Swersky

この方法を試してください。画像を保存するフィールドのタイプがbyteの場合に機能するはずです。まず、画像用のbyte[]を作成します。次に、IDataParameter型のbinaryを使用してDBに保存します。

using System.Drawing;
using System.Drawing.Imaging;
using System.Data;

    public static void PerisitImage(string path, IDbConnection connection)
    {
        using (var command = connection.CreateCommand ())
        {
            Image img = Image.FromFile (path);
            MemoryStream tmpStream = new MemoryStream();
            img.Save (tmpStream, ImageFormat.Png); // change to other format
            tmpStream.Seek (0, SeekOrigin.Begin);
            byte[] imgBytes = new byte[MAX_IMG_SIZE];
            tmpStream.Read (imgBytes, 0, MAX_IMG_SIZE);

            command.CommandText = "INSERT INTO images(payload) VALUES (:payload)";
            IDataParameter par = command.CreateParameter();
            par.ParameterName = "payload";
            par.DbType = DbType.Binary;
            par.Value = imgBytes;
            command.Parameters.Add(par);
            command.ExecuteNonQuery ();
        }
    }
23
jethro

C#で画像を_byte[]_に変換すると、データベース列がvarbinary(MAX)になります。

その後は、他のデータ型を保存するようなものです。

6
Mike M.

これは、asp.netでFileUploadコントロールを使用するメソッドです。

byte[] buffer = new byte[fu.FileContent.Length];
Stream s = fu.FileContent;
s.Read(buffer, 0, buffer.Length);
//Then save 'buffer' to the varbinary column in your db where you want to store the image.
6
Abe Miessler

データベースにイメージのパスを保存するか、イメージ自体をBLOB(バイナリ-バイトの配列)として保存できます。アプリケーションがWebアプリケーションである場合は、取得したケースによって異なります。イメージははるかに優れています。ただし、集中型データベースに接続するクライアントベースのアプリケーションを入手した場合は、バイナリとして保存する必要があります。

2
Khaled

私の個人的な好みは、画像をそのままデータベースに保存することではありません。ファイルシステムのどこかにイメージを保存し、データベースに参照を保存します。

1
Jaydee

SQLを使用しているため、特にイメージをロードしている場合は、アドホック(「文字列でのステートメントの記述」)の使用を推奨します。

ADO.NETは、マッピングやエスケープなどの面倒な作業をすべて自動で行うことができます。

ストアドプロシージャを作成するか、SqlParameterを使用してバインドを行います。

他のポスターが言うように、ストレージタイプとしてVARBINARY(MAX)を使用してください-IMAGEは廃止されています。

1
StuartLC