none
Windowsアプリケーション作成 RRS feed

  • 質問

  • Visual Studio2017でADO.NET(C#)を使ったデータベース(SQL Server)プログラミングでWindowsアプリケーションを作成しています。

    エクスプローラーにある画像を選択してデータベースに保存しデータベースに保存してある画像を検索してListViewに表示したいです。

    保存方法は保存場所が移動したり他のパソコンでWindowsアプリケーションを使用する場合があるのでパスではなく直接画像をDBに保存したいです。

    ADO.NET(C#)を使ったデータベース(SQL Server)プログラミングは勉強し始めたばかりなので丁寧に教えて下さい。

    ちなみにデータベースで

    CLEATE TABLE[dbo].[IMAGE]
    (
        [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        [Keyword] NVARCHAR(50) NULL
    )

    だけは使いたいです。

    ListViewに画像を表示するのは

    //ListViewコントロールで画像を一覧表示するプログラム

    Image createThumbnail(Image image, int w, int h) { Bitmap canvas = new Bitmap(w, h); Graphics g = Graphics.FromImage(canvas); g.FillRectangle(new SolidBrush(Color.White), 0, 0, w, h); float fw = (float)w / (float)image.Width; float fh = (float)h / (float)image.Height; float scale = Math.Min(fw, fh); fw = image.Width * scale; fh = image.Height * scale; g.DrawImage(image, (w - fw) / 2, (h - fh) / 2, fw, fh); g.Dispose(); return canvas; } private void button1_Click(object sender, EventArgs e) { string imageDir = @"..."; // 画像ディレクトリ string[] jpgFiles = System.IO.Directory.GetFiles(imageDir, "*.jpg"); int width = 100; int height = 80; imageList1.ImageSize = new Size(width, height); listView1.LargeImageList = imageList1; for (int i = 0; i < jpgFiles.Length; i++) { Image original = Bitmap.FromFile(jpgFiles[i]); Image thumbnail = createThumbnail(original, width, height); imageList1.Images.Add(thumbnail); listView1.Items.Add(jpgFiles[i], i); original.Dispose(); thumbnail.Dispose(); } }

    を活用して画像を複数表示したいです。



    • 編集済み aqwpue 2019年11月4日 2:06 質問内容が詳しくなかったから
    2019年11月3日 2:50

回答

  • ご参考にどうぞ。

    テーブルレイアウトは下記です。

    CREATE TABLE [dbo].[Table] (
         [PhotoID] INT            IDENTITY (1, 1) NOT NULL,
         [Titke]   NVARCHAR (MAX) NULL,
         [Keyword] NVARCHAR (MAX) NULL,
         [Photo]   VARBINARY(MAX) NULL,
         PRIMARY KEY CLUSTERED ([PhotoID] ASC)
     )

    コード。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private SqlConnection conn;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                // いいタイミングでDB接続済みと仮定
                var connectionString = @"Data Source=XXXX;Initial Catalog=XXXX;User ID=XXXX;Password=XXXX;";
                conn = new SqlConnection(connectionString);
                conn.Open();
            }
    
            private void openDialogButton_Click(object sender, EventArgs e)
            {
                var dialog = new OpenFileDialog();
                dialog.Filter = "JPEGファイル(*.jpg)|*.jpg";
                if (dialog.ShowDialog() == DialogResult.Cancel)
                {
                    return;
                }
                filePathTextBox.Text = dialog.FileName;
            }
    
            /// <summary>
            /// 指定された画像パスから画像ファイル名、画像のバイナリデータをSQLServerへ登録
            /// Keywordは何入れるのか分からない
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void addButton_Click(object sender, EventArgs e)
            {
                var ms = new MemoryStream();
                Image.FromFile(filePathTextBox.Text).Save(ms, ImageFormat.Jpeg);
    
                var query = "INSERT INTO [dbo].[Table] (Titke, Keyword, Photo) VALUES (@Titke, @Keyword, @Photo)";
                var command = new SqlCommand(query, conn);
                command.Parameters.Add(new SqlParameter("@Titke", Path.GetFileName(filePathTextBox.Text)));
                command.Parameters.Add(new SqlParameter("@Keyword", "なんか設定?"));
                command.Parameters.Add(new SqlParameter("@Photo", ms.ToArray()));
                command.ExecuteNonQuery();
            }
    
            /// <summary>
            /// DB内を全検索してListViewへ設定
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void searchButton_Click(object sender, EventArgs e)
            {
                // ListViewの下準備
                int width = 100;
                int height = 80;
                imageList.ImageSize = new Size(width, height);
                listView.LargeImageList = imageList;
                listView.Items.Clear();
    
                // 検索
                var query = "SELECT Titke, Photo FROM [dbo].[Table]";
                var command = new SqlCommand(query, conn);
                var dt = new DataTable();
                var adapter = new SqlDataAdapter(command);
                adapter.Fill(dt);
    
                // PhotoをImageオブジェクトにしてサムネイル用にサイズ調整し、
                // Titkeと一緒にListViewへ追加
                foreach (var row in dt.AsEnumerable())
                {
                    var titke = row["Titke"].ToString();
                    var ms = new MemoryStream((byte[])row["Photo"]);
    
                    var original = Image.FromStream(ms);
                    var thumbnail = createThumbnail(original, width, height);
    
                    imageList.Images.Add(thumbnail);
                    listView.Items.Add(titke, dt.Rows.IndexOf(row));
    
                    original.Dispose();
                    thumbnail.Dispose();
                }
            }
    
            /// <summary>
            /// https://www.atmarkit.co.jp/ait/articles/0508/12/news091.html
            /// から丸々パクり。
            /// </summary>
            /// <param name="image"></param>
            /// <param name="w"></param>
            /// <param name="h"></param>
            /// <returns></returns>
            private Image createThumbnail(Image image, int w, int h)
            {
                Bitmap canvas = new Bitmap(w, h);
    
                Graphics g = Graphics.FromImage(canvas);
                g.FillRectangle(new SolidBrush(Color.White), 0, 0, w, h);
    
                float fw = (float)w / (float)image.Width;
                float fh = (float)h / (float)image.Height;
    
                float scale = Math.Min(fw, fh);
                fw = image.Width * scale;
                fh = image.Height * scale;
    
                g.DrawImage(image, (w - fw) / 2, (h - fh) / 2, fw, fh);
                g.Dispose();
    
                return canvas;
            }
        }
    }
    

    動かしたらこうなる。

    • 回答としてマーク aqwpue 2019年11月6日 23:45
    2019年11月6日 5:46

すべての返信

  • Teratail とマルチポストですよね。ここではマルチポストは遠慮いただくようにと管理者の方からお願いがでています。
    2019年11月4日 22:50
  • Teratail とマルチポストをしてしまい申し訳ございませんでした。

    Teratail の質問は削除依頼をしました。

    なので回答をお願いします。

    2019年11月4日 23:28
  • > 丁寧に教えて下さい。

    丁寧に教えてほしいということなら丁寧に聞きませんか? どういうことかと言うと:

    (1) 何を作っているか書く。(Windows Forms? WPF? ASP.NET Web Forms? その他?)

    (2) 開発環境を書く。(OS, .NET, SQL Server のバージョン・エディションなど)

    (3) どこまで自分で実装できていて、どこで躓いていて、何が分かれば解決するか、範囲を絞って具体的に書く。(やりたいこと全体のシナリオ・ストーリーを書くのは良いことだと思いますが、その全部を教えてくれと言うのは質問として NG です)

    (4) 関連する前のスレッドの URL を書いて、それとの関連性を書く。(前のスレッドで SQL Server への画像の保存のやり方は解決したはず)
    2019年11月5日 1:11
  • (1)Windows Formを作っています。

    (2)開発環境はVisual Studio2017,VisualC#2017,ADO.NET,SQLServerでOSはWindows10です。

    (3)ListViewコントロールにパスを使って画像を一覧表示することはできました。しかし直接画像をDBに保存する方法と保存した画像を画像の名前(imag.jpg)で画像を検索してListViewにパスを使わず表示する方法がわからないので教えてほしいです。

    (4)関連する前のスレッドは「https://social.msdn.microsoft.com/Forums/ja-JP/da818d8d-d2dd-4596-b651-5d2a8b5cf145/visual-c201712395123881235612390?forum=netfxgeneralja#da818d8d-d2dd-4596-b651-5d2a8b5cf145」です。前は画像をパスでDBに保存してパスを使って画像を表示したいと質問しました。

    しかし画像の保存場所が移動したり他のパソコンでWindowsアプリケーションを使用する場合があるのでパスではなく直接画像をDBに保存しパスではなく名前で画像を検索してListViewに表示させたいです。(ListViewを使用する理由は画像を名前と一緒に複数表示したいからです。)

    2019年11月5日 6:17
  • > (2)開発環境はVisual Studio2017,VisualC#2017,ADO.NET,SQLServerでOSはWindows10です。

    .NET のバージョンは何ですか?

    SQL Server は LocalDB ですか、それとも Express 版とか Developer 版とかですか。そのバージョンは何ですか?


    > (3)ListViewコントロールにパスを使って画像を一覧表示することはできました。しかし直接画像をDBに保存する方法と保存した画像を画像の名前(imag.jpg)で画像を検索してListViewにパスを使わず表示する方法がわからないので教えてほしいです。

    質問者さんが何を聞きたいのか依然として分かりません。

    SQL Server に画像ファイルを保存する方法と SQL Server から画像ファイルを取り出す方法は前のスレッド(URL 下記)で解決済みですよね。前のスレッドの課題が解決済みなら上に書いてあることも解決済みのはずなのですが・・・

    Visual C#2017について
    https://social.msdn.microsoft.com/Forums/ja-JP/da818d8d-d2dd-4596-b651-5d2a8b5cf145/visual-c201712395123881235612390?forum=netfxgeneralja#da818d8d-d2dd-4596-b651-5d2a8b5cf145

    前のスレッドでは DB の構造は以下のようになっているとのことでしたが、これは変わらないのですよね?

    CREATE TABLE [dbo].[Table] (
        [PhotoID] INT            IDENTITY (1, 1) NOT NULL,
        [Titke]   NVARCHAR (MAX) NULL,
        [Keyword] NVARCHAR (MAX) NULL,
        [Photo]   NVARCHAR (MAX) NULL,
        PRIMARY KEY CLUSTERED ([PhotoID] ASC)
    );

    で、今度は Keyword などで検索してヒットした画像データを SQL Server からとりだして、それを ListView に表示したいということですか? PC のフォルダの画像を ListView に表示することはできたそうですので、SQL Server からの画像も同様にできると思うのですが?

    上にも書きましたが、どこまで自分で実装できていて(コードをアップしてください)、どこで躓いていて、何が分かれば解決するか、範囲を絞って具体的に書いてください。そうしてもらえると話が進めやすくなると思います。

    #全く分からないのでゼロから全部教えてくれと言うのは質問として NG ですよ。


    • 編集済み SurferOnWww 2019年11月5日 7:54 訂正
    2019年11月5日 7:53
  • 画像を DB に登録するにはテーブル定義の Photo 列を nvarchar でなくバイナリを登録できる型にしましょう。

    https://docs.microsoft.com/ja-jp/sql/t-sql/data-types/binary-and-varbinary-transact-sql?view=sql-server-ver15

    DBから読み出した画像データは Image クラスに流し込んで画像オブジェクトとして使えるようにしてそれを表示しましょう。
    参考になるかわかりませんが↓が見つかりました。
    https://www.atmarkit.co.jp/ait/articles/0508/12/news091.html

    2019年11月5日 9:48
  • 前のスレッド

    https://social.msdn.microsoft.com/Forums/ja-JP/da818d8d-d2dd-4596-b651-5d2a8b5cf145/visual-c201712395123881235612390?forum=netfxgeneralja#da818d8d-d2dd-4596-b651-5d2a8b5cf145

    と同じテーブル

    CREATE TABLE [dbo].[Table] (
         [PhotoID] INT            IDENTITY (1, 1) NOT NULL,
         [Titke]   NVARCHAR (MAX) NULL,
         [Keyword] NVARCHAR (MAX) NULL,
         [Photo]   NVARCHAR (MAX) NULL,
         PRIMARY KEY CLUSTERED ([PhotoID] ASC)
     )

    のPotoにパス(C\test\~.jpg)を格納し画像を表示しています。

    しかし保存場所が移動したり他のパソコンでWindowsFormを使用すると画像が表示されなくなってしまいます。

    なので画像をDBに直接格納する方法がわからないので教えてほしいです。

    また

    string connstring = @"...";
                using (SqlConnection Conn = new SqlConnection(connstring))
                {
                    Conn.Open();
                    string sql = "select Photo from Table";
                    SqlCommand cmd = new SqlCommand(sql, Conn);
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        var m = reader[0].ToString();
                        pictureBox1.ImageLocation = m;
                    }
                }

    のpictureBox1.ImageLocation = m;を

    //ListViewコントロールで画像を一覧表示するプログラム
    
    Image createThumbnail(Image image, int w, int h)
                {
                    Bitmap canvas = new Bitmap(w, h);
    
                    Graphics g = Graphics.FromImage(canvas);
                    g.FillRectangle(new SolidBrush(Color.White), 0, 0, w, h);
    
                    float fw = (float)w / (float)image.Width;
                    float fh = (float)h / (float)image.Height;
    
                    float scale = Math.Min(fw, fh);
                    fw = image.Width * scale;
                    fh = image.Height * scale;
    
                    g.DrawImage(image, (w - fw) / 2, (h - fh) / 2, fw, fh);
                    g.Dispose();
    
                    return canvas;
                }
    
    
                private void button1_Click(object sender, EventArgs e)
                {
                    string imageDir = @"..."; // 画像ディレクトリ
                    string[] jpgFiles =
                      System.IO.Directory.GetFiles(imageDir, "*.jpg");
    
                    int width = 100;
                    int height = 80;
    
                    imageList1.ImageSize = new Size(width, height);
                    listView1.LargeImageList = imageList1;
    
                    for (int i = 0; i < jpgFiles.Length; i++)
                    {
                        Image original = Bitmap.FromFile(jpgFiles[i]);
                        Image thumbnail = createThumbnail(original, width, height);
    
                        imageList1.Images.Add(thumbnail);
                        listView1.Items.Add(jpgFiles[i], i);
    
                        original.Dispose();
                        thumbnail.Dispose();
                    }
                }
    
    を応用して画像を表示してしたいんですが応用の仕方がわからないので教えてほしいです。

    • 編集済み aqwpue 2019年11月5日 9:52
    2019年11月5日 9:51
  • 話が通じないようです。すみませんが自分はお役に立てそうもありません。学校に行くとか講習を受けるとかして、Face-to-face でやり取りして、何が分からないかを探ってもらって、教えてもらえる人を探す方がよさそうな気がします。
    2019年11月5日 12:10
  • 提案ですが、ListView では無く、DataGridView ではいけないのでしょうか?。
    その方がネット上にサンプルや解説が多い気がします。

    「 C# SQLserver Image DataGridView 」で検索して見ませんか?。
    類似例が沢山見付かると思うのですが。

    そして、質問は漠然としたもので無く、ピンポイントに絞られてからにしましょう。
    不明点を絞る作業をする事で、知識も付きますし、質問に対する回答も増えると思います。

    2019年11月5日 12:57
  • 何故以下の質問には答えないのですか?

    >> (2)開発環境はVisual Studio2017,VisualC#2017,ADO.NET,SQLServerでOSはWindows10です。
    >
    > .NET のバージョンは何ですか?
    >
    > SQL Server は LocalDB ですか、それとも Express 版とか Developer 版とかですか。そのバージョンは何ですか?

    それから、私以外にも galaco さん、ShiroYuki_Mot さんもレスしていますけど、何故レスに対してきちんとフィードバックを返さないのですか? 役立った・立たなかった、役に立たなかったなら何故かぐらいは返事できると思うのですが。

    そのあたりをきちんと対応しないと、話が通じない以前のマナーの問題で、スルーされた人はあなたの質問に答える気しはなくなりますよ。

    • 編集済み SurferOnWww 2019年11月6日 1:18 脱字追加
    2019年11月6日 1:15
  • .NET Foamewor4.7を使っています。

    SQL ServerはExpress2017を使っています。

    >galaco さん

    バイナリで登録するというアドバイスありがとうございます。

    >>DBから読み出した画像データは Image クラスに流し込んで画像オブジェクトとして使えるようにしてそれを表示しましょう。

    >https://www.atmarkit.co.jp/ait/articles/0508/12/news091.html

    を参考に画像の表示は分かりましたがDBから読み出した画像データは Image クラスに流し込んで画像オブジェクトとして使えるようにしてそれを表示する方法が読んだだけではわからなかったです。

    >ShiroYuki_Mot さん

    >>提案ですが、ListView では無く、DataGridView ではいけないのでしょうか?。
    その方がネット上にサンプルや解説が多い気がします。
    「 C# SQLserver Image DataGridView 」で検索して見ませんか?。
    類似例が沢山見付かると思うのですが。

    >「 C# SQLserver Image DataGridView 」で検索しましたが僕は役に立つサイトを見つけることはできませんでした。

    なので初心者にもわかりやすくC#のコードが書いてあるさいサイトをみつけたら教えてくれると助かります。

    2019年11月6日 2:32
  • 前のスレッド

    https://social.msdn.microsoft.com/Forums/ja-JP/da818d8d-d2dd-4596-b651-5d2a8b5cf145/visual-c201712395123881235612390?forum=netfxgeneralja#da818d8d-d2dd-4596-b651-5d2a8b5cf145

    と同じテーブル

    CREATE TABLE [dbo].[Table] (
         [PhotoID] INT            IDENTITY (1, 1) NOT NULL,
         [Titke]   NVARCHAR (MAX) NULL,
         [Keyword] NVARCHAR (MAX) NULL,
         [Photo]   NVARCHAR (MAX) NULL,
         PRIMARY KEY CLUSTERED ([PhotoID] ASC)
     )

    のPotoにパス(C\test\~.jpg)を格納し画像を表示しています。

    しかし保存場所が移動したり他のパソコンでWindowsFormを使用すると画像が表示されなくなってしまいます。

    なのでPhotoをvardinaryにするのは分かりました。

    しかし前回の

    // Convert image to byte data. 
            public byte[] imageToByteArray(System.Drawing.Image imageIn)
            {
                MemoryStream ms = new MemoryStream();
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                return ms.ToArray();
            }
                  
           // Convert byte data to image.
            public Image byteArrayToImage(byte[] byteArrayIn)
            {
                MemoryStream ms = new MemoryStream(byteArrayIn);
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
    
            // use imageToByteArray method to convert image to byte data, and store the data in database.
            private void button1_Click(object sender, EventArgs e)
            {
                string connstring = @"Data Source=… ";
                using (SqlConnection Conn = new SqlConnection(connstring))
                {
                    Conn.Open();
                    string storePath = @"path "; // path of image in your Windows Explorer.
                    byte[] b = imageToByteArray(Image.FromFile(storePath));
                    // Insert data into the table in database.
                    // imageBinary in TableImage is used to store the byte data, Specialcode in TableImage is like an ID.
                    string sql = "INSERT INTO TableImage(SpecialCode,imagebinary) VALUES (@SpecialCode,@imagebinary)";
                    SqlCommand cmd2 = new SqlCommand(sql, Conn);
                    SqlParameter param = cmd2.Parameters.Add("@imagebinary", SqlDbType.VarBinary);                
      param.Value = b;
                    SqlParameter param1 = cmd2.Parameters.Add("@SpecialCode", SqlDbType.NVarChar);
                    param1.Value = "test1";
                    cmd2.ExecuteNonQuery();
                    MessageBox.Show("Success");
                }
            }

    と教えてもらったのと

    private void button1_Click(object sender, EventArgs e)
            {
                String OpenFileName;
    
                if(openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    OpenFileName = openFileDialog1.FileName;
                }
                else
                {
                    return;
                }
    
                string fileName = Path.GetFileName(OpenFileName);
                textBox1.Text += fileName + "\r\n";
    
            }

    を使って画像名(~.jpg)をtextBoxに表示してtextBox表示してある画像名を使ってDBのPhotoとTitkeにどのように格納したら良いかわからないので教えてほしいです。

    2019年11月6日 2:40
  • >「 C# SQLserver Image DataGridView 」で検索しましたが僕は役に立つサイトを見つけることは
    >できませんでした。なので初心者にもわかりやすくC#のコードが書いてあるさいサイトをみつけたら教え
    >てくれると助かります。

    SQL Serverの話と、DataGridViewの話を、一度にしようとするのがよくないです。

    そもそも、aqwqueさんが書かれるプログラムにおいて、Imageを一時的にどう保持するか、これがひとつの問題で、aqwqueさんが、質問し勉強して、いろんな方法を知って、どれを使うか決めるべきです。

    その上で、SQL ServerにImageをどう格納するか、逆にSQL Serverからどう取り出すか、それぞれ、問題です。

    さらに、ImageをDataGridViewに表示させる方法はどうするか? これも問題です。

    大きな課題を小さな課題・問題に分解して、それぞれ解決していかなければなりません。


    • 編集済み 外池 2019年11月6日 2:52
    2019年11月6日 2:50
  • 前の質問でデータベースの1レコードなら扱える様に(画像格納・ファイル保存と読み出し)なったのではないですか?。

     コードを追加質問されていますが、
     param1.Value = "test1";
     "test1" を 定義した fileName に替えるだけ?なのでは?。

    そして、データ数がある程度増えれば、
    先に書いた結果のどれかで進められる気がしますが、
    分からなければ、一旦、そのプロジェクトから離れて、
    最初に、文字列主体のデータベースの学習をお勧めします。
    https://docs.microsoft.com/ja-jp/visualstudio/data-tools/create-a-simple-data-application-by-using-adonet?view=vs-2019
    左欄の使い方ガイドの各項目も参照。

    初心者が皆同じ階段を登る訳では無いので、人 夫々 です。
    手取り足取り教えて欲しければ、このサイトはそぐわない気がします。
    ある程度のレベルに達してからのご利用をお勧めします。
    2019年11月6日 5:06
  • ご参考にどうぞ。

    テーブルレイアウトは下記です。

    CREATE TABLE [dbo].[Table] (
         [PhotoID] INT            IDENTITY (1, 1) NOT NULL,
         [Titke]   NVARCHAR (MAX) NULL,
         [Keyword] NVARCHAR (MAX) NULL,
         [Photo]   VARBINARY(MAX) NULL,
         PRIMARY KEY CLUSTERED ([PhotoID] ASC)
     )

    コード。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private SqlConnection conn;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                // いいタイミングでDB接続済みと仮定
                var connectionString = @"Data Source=XXXX;Initial Catalog=XXXX;User ID=XXXX;Password=XXXX;";
                conn = new SqlConnection(connectionString);
                conn.Open();
            }
    
            private void openDialogButton_Click(object sender, EventArgs e)
            {
                var dialog = new OpenFileDialog();
                dialog.Filter = "JPEGファイル(*.jpg)|*.jpg";
                if (dialog.ShowDialog() == DialogResult.Cancel)
                {
                    return;
                }
                filePathTextBox.Text = dialog.FileName;
            }
    
            /// <summary>
            /// 指定された画像パスから画像ファイル名、画像のバイナリデータをSQLServerへ登録
            /// Keywordは何入れるのか分からない
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void addButton_Click(object sender, EventArgs e)
            {
                var ms = new MemoryStream();
                Image.FromFile(filePathTextBox.Text).Save(ms, ImageFormat.Jpeg);
    
                var query = "INSERT INTO [dbo].[Table] (Titke, Keyword, Photo) VALUES (@Titke, @Keyword, @Photo)";
                var command = new SqlCommand(query, conn);
                command.Parameters.Add(new SqlParameter("@Titke", Path.GetFileName(filePathTextBox.Text)));
                command.Parameters.Add(new SqlParameter("@Keyword", "なんか設定?"));
                command.Parameters.Add(new SqlParameter("@Photo", ms.ToArray()));
                command.ExecuteNonQuery();
            }
    
            /// <summary>
            /// DB内を全検索してListViewへ設定
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void searchButton_Click(object sender, EventArgs e)
            {
                // ListViewの下準備
                int width = 100;
                int height = 80;
                imageList.ImageSize = new Size(width, height);
                listView.LargeImageList = imageList;
                listView.Items.Clear();
    
                // 検索
                var query = "SELECT Titke, Photo FROM [dbo].[Table]";
                var command = new SqlCommand(query, conn);
                var dt = new DataTable();
                var adapter = new SqlDataAdapter(command);
                adapter.Fill(dt);
    
                // PhotoをImageオブジェクトにしてサムネイル用にサイズ調整し、
                // Titkeと一緒にListViewへ追加
                foreach (var row in dt.AsEnumerable())
                {
                    var titke = row["Titke"].ToString();
                    var ms = new MemoryStream((byte[])row["Photo"]);
    
                    var original = Image.FromStream(ms);
                    var thumbnail = createThumbnail(original, width, height);
    
                    imageList.Images.Add(thumbnail);
                    listView.Items.Add(titke, dt.Rows.IndexOf(row));
    
                    original.Dispose();
                    thumbnail.Dispose();
                }
            }
    
            /// <summary>
            /// https://www.atmarkit.co.jp/ait/articles/0508/12/news091.html
            /// から丸々パクり。
            /// </summary>
            /// <param name="image"></param>
            /// <param name="w"></param>
            /// <param name="h"></param>
            /// <returns></returns>
            private Image createThumbnail(Image image, int w, int h)
            {
                Bitmap canvas = new Bitmap(w, h);
    
                Graphics g = Graphics.FromImage(canvas);
                g.FillRectangle(new SolidBrush(Color.White), 0, 0, w, h);
    
                float fw = (float)w / (float)image.Width;
                float fh = (float)h / (float)image.Height;
    
                float scale = Math.Min(fw, fh);
                fw = image.Width * scale;
                fh = image.Height * scale;
    
                g.DrawImage(image, (w - fw) / 2, (h - fh) / 2, fw, fh);
                g.Dispose();
    
                return canvas;
            }
        }
    }
    

    動かしたらこうなる。

    • 回答としてマーク aqwpue 2019年11月6日 23:45
    2019年11月6日 5:46
  • aqwpueさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問によると、画像の参照をデータベースに保存したくありません。
    通常、Imageをバイナリ配列またはバイト配列に変換してから、データベースに保存します。



    下記リンクをご参照いただければと思います。
    How to save image in database using C# [closed]

    前のスレッドで画像をバイナリに変換し、データベースに保存する例があります。

    私の認識が間違ったら、質問の詳細をご提供いただければと思います。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年11月6日 8:00
    モデレータ
  • takituさん教えてくださりありがとうございました。うまく画像を表示できました。

    keywordはtextBowに入力したのを挿入します。

    画像の表示をキーワードで検索

    var query = "SELECT Titke, Photo FROM [dbo].[Table1]"+
                            "WHERE keyword Like N'%" + textBox2.Text + "%'";

    にしましたが2回目検索すると1回目に検索した結果が表示されてしまい2回目の検索結果が正しく表示されません。

    なので2回目の検索結果を正しく表示させたいんですがどのように表示させたらよいかわからないので教えてほしいです。

    • 編集済み aqwpue 2019年11月6日 12:27
    2019年11月6日 11:16
  • フォーラムオペレーターのHarukaさん。回答してくださりありがとうございます。

    質問の内容は複数の画像をDBにバイナリで直接保存し保存した画像をキーワードで検索してListViewコントロールに画像を一覧表示するプログラムを作りたいです。しかし初心者で検索してもプログラムが出てこなかったので質問しました。

    2019年11月6日 11:49
  • ブレイクポイントを張ってデバッグしたら分かるのではないですか?
    求めたSQLが発行されているか、取得したデータの反映に問題がないか、それぞれステップインしながら確認してみてください。

    現段階のコード提示がない状態で、そこまで事細かい事を質問されても、上記のようにしか回答のしようがありません。

    また、もはや元の質問と異なっています。
    そのため、この質問はクローズし、問題箇所を明確にした上で、新たに質問することをおすすめします。

    • 編集済み takiru 2019年11月7日 2:02
    2019年11月6日 14:42