none
Visual C#2017について RRS feed

  • Question

  • Visual C#2017を使ったADO.NETによるデータベースプログラミングでテーブルに画像を格納する方法とボタンを押すとデータベースに格納してある画像を選択(検索)して画面に表示する方法とボタンを押すとエクスプローラーに保存してある画像をデータベースに保存(格納)する方法とボタンを押すとデータベースに格納した画像を選択(検索)して削除する方法がわからないので教えて下さい。

    Wednesday, October 16, 2019 1:48 PM

Answers

  • aqwpueさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信いただきありがとうございます。

    下記のコードを試してください:
    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;
                    }
                }
    

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

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

    • Marked as answer by aqwpue Saturday, November 2, 2019 1:34 PM
    Wednesday, October 30, 2019 8:28 AM
    Moderator

All replies

  • あまりに質問が広範囲すぎて答えることができません。データベースはSQL Serverでしょうか?
    とりあえず「c# sql server 画像 保存」辺りでネットを検索するといろいろ情報が出てきますので、まずは試してみて下さい。
    その上で、つまづいたら、ここがわからないと具体的な質問をして下さい。
    一歩ずつ行きましょう。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    Thursday, October 17, 2019 7:38 AM
    Moderator
  • Visual C#を使ったADO.NETでSQL Serverを使っていますがWindowsエクスプローラに保存してある画像をデータベースに格納する方法とデータベースに格納した画像を指定して画面に抽出する方法がわからないので教えてください。
    Saturday, October 19, 2019 10:59 PM
  • あなたが前に立てた以下のスレッドと同じ質問ですよね? 止めましょう。前のスレッドでレスをくれた人に失礼であるばかりでなく、スレッドの乱立がフォーラムの参加者全員に迷惑であることを自覚してください。

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


    マイクロソフトの管理者の方>

    統合するなどの対応をお願いします。

    Sunday, October 20, 2019 1:04 AM
  • Visual C#2017を使ったADO.NETによるデータベースプログラミングでSql Serverを使っていてWindowsエクスプローラーに保存してある画像をテーブルに格納する方法を教えてください。
    Sunday, October 20, 2019 1:55 AM
  • SQL Serverに画像(というかファイルですよね)を保存する方法は3つあります。

    Blob (SQL Server) を保存するオプションの比較
    https://docs.microsoft.com/ja-jp/sql/relational-databases/blob/compare-options-for-storing-blobs-sql-server?view=sql-server-ver15

    おすすめはFileTableを使うことです。以下を読めばSQL Serverでファイル(バイナリデータ)を保存する方法がどのように変化してきたことがわかると思います。また、FileTableを使用する方法も参考になると思います。

    SQL Server開発の利便性を向上させるFileTable/シーケンスオブジェクト/ページング機能
    https://codezine.jp/article/detail/6602

    FileTableを作ってしまえば、あとは普通にSQLで操作できるようになります。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    Monday, October 21, 2019 1:01 AM
    Moderator
  • SurferOnWwwさん、ご確認いただきありがとうございます。
    スレッドの統合をさせていただきました。

    aqwpueさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問の件につきまして、私側でテストを行いました。
    次のコードをご参照いただければと思います:

    public byte[] imageToByteArray(System.Drawing.Image imageIn)
            {
                MemoryStream ms = new MemoryStream();
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                return ms.ToArray();
            }
            public Image byteArrayToImage(byte[] byteArrayIn)
            {
                MemoryStream ms = new MemoryStream(byteArrayIn);
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
            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));
                    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 button2_Click(object sender, EventArgs e)
            {
                string savePath = @"path you want to save the image";
                string connstring = @"Data Source=… ";
                using (SqlConnection Conn = new SqlConnection(connstring))
                {
                    Conn.Open();
                    string sql = "select imagebinary from TableImage";
                    SqlCommand cmd = new SqlCommand(sql, Conn);
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        var m = (byte[])reader[0];
                        Image i = byteArrayToImage(m);                  
                        pictureBox1.Image = i;
                        i.Save(savePath, ImageFormat.Jpeg);
                        MessageBox.Show("Success");
                   }
                }
            }
    

    結果:

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


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

    Friday, October 25, 2019 7:40 AM
    Moderator
  • button2は画像を表示するプログラムなのはわかりましたがbotton1は何をするプログラムかわからないので教えてください。

    またどこを改善すれば使えつのかもわからないので教えてください。


    • Edited by aqwpue Monday, October 28, 2019 1:53 AM
    Monday, October 28, 2019 1:53 AM
  • aqwpueさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信いただきありがとうございます。

    コードを更新しました(いくつかのコメントを追加しました)。ご確認ください。

    // 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");
                }
            }
           
           // select data from database and convert it to image, then save it.
            private void button2_Click(object sender, EventArgs e)
            {
                string savePath = @"path you want to save the image";
                string connstring = @"Data Source=… ";
                using (SqlConnection Conn = new SqlConnection(connstring))
                {
                    Conn.Open();
                    string sql = "select imagebinary from TableImage";
                    SqlCommand cmd = new SqlCommand(sql, Conn);
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        var m = (byte[])reader[0];
                        Image i = byteArrayToImage(m);                  
                        pictureBox1.Image = i;
                        i.Save(savePath, ImageFormat.Jpeg);
                        MessageBox.Show("Success");
                   }
                }
            }

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


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

    Monday, October 28, 2019 8:52 AM
    Moderator
  • 丁寧に教えてくださりありがとうございます。

    質問ですがVisual Studio2017でADO.NETによるデータベース(Sql Server)プログラミングで

    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)
    );

    というテーブルを作り[Photo]にC:\test\121215431465464.jpgを挿入しました。
    ボタンを押すと pictureBox1に画像が表示されるプログラムを作りたく

    private void button1_Click(object sender, EventArgs e)
            {
    
    
                string a = "SELECT [Photo] FROM [dbo].[Table]";
                SqlConnection conn = new SqlConnection(cnstr);
                SqlCommand cmd = new SqlCommand(a, conn);
                conn.Open();
    
                SqlDataReader rd = cmd.ExecuteReader();
    
                    pictureBox1.ImageLocation = a;
                
                rd.Close();
                conn.Close();
            }
    と作り実行しボタンを押したらエラーコードは表示されず×印だけ表示され画像は表示されませんでした。
    何が間違っているのかわからないので教えてください。



    • Edited by aqwpue Tuesday, October 29, 2019 11:59 PM
    Monday, October 28, 2019 11:01 PM
  • aqwpueさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信いただきありがとうございます。

    下記のコードを試してください:
    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;
                    }
                }
    

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

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

    • Marked as answer by aqwpue Saturday, November 2, 2019 1:34 PM
    Wednesday, October 30, 2019 8:28 AM
    Moderator
  • 回答してくれてありがとうございます。

    プログラムをコピーして実行したらエラーコードは表示されませんでしたがボタンを押すと

     using (SqlConnection Conn = new SqlConnection(connstring))
                

    のところが初期化文字列の形式が使用に適合していません。index 0 で始まっていますというエラーが表示されて

    System.ArgumentException: 初期化文字列の形式が使用に適合しません。index 0 で始まっています。
       場所 System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue)
       場所 System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey)
       場所 System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules)
       場所 System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)
       場所 System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)
       場所 System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)
       場所 System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
       場所 System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
       場所 System.Data.SqlClient.SqlConnection..ctor(String connectionString, SqlCredential credential)
       場所 System.Data.SqlClient.SqlConnection..ctor(String connectionString)
       場所 System.Windows.Forms.Control.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       場所 System.Windows.Forms.Control.WndProc(Message& m)
       場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
       場所 System.Windows.Forms.Button.WndProc(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    というエラーの詳細が表示されました。

    どのように直したらよいかわからないので教えてください。


    • Edited by aqwpue Thursday, October 31, 2019 12:23 AM
    Thursday, October 31, 2019 12:07 AM
  • aqwpueさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信いただきありがとうございます。

    正しい接続文字列を取得するには、次のリファレンスをご参照いただければと思います:
    How to get the connection String from a database

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

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

    Friday, November 1, 2019 1:52 AM
    Moderator
  • うまく表示させることができました。

    分かりやすく教えてくれてありがとうございます。

    Saturday, November 2, 2019 1:36 PM