4

最後の質問で助けてくれたすべての人に感謝します。しかし今、私はMSアクセスへのsaveimageである別のステートメントに問題があります。まずお聞きしたいのですが、ms access データベースの場合、データ型は添付ファイルを入れるべきですか?

私のコード:

private void button2_Click(object sender, EventArgs e)
        {

            OleDbCommand cmd = new OleDbCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "insert into Table1 (id,picture) values ('" + textBox1.Text +  "')";

            cmd.Connection = con;
            con.Open();
            cmd.ExecuteNonQuery();
            System.Windows.Forms.MessageBox.Show("Created", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
            con.Close();

        }

openFIledialog を使用して、自分の写真をピクチャ ボックスに挿入します。

4

1 に答える 1

11

まず、パラメータを使用します。SQL インジェクションに対してそれ自体を開くため、SQL コマンドの文字列を連結しないでください。これは、将来多くの問題を回避するための、簡単に実行できる優れたプラクティスです。

つまり、次のようなものが機能するはずです。

// You've got the filename from the result of your OpenDialog operation
var pic = File.ReadAllBytes(yourFileName);
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into Table1 (id, picture) values (@p1, @p2)";
cmd.Parameters.AddWithValue("@p1", TextBox1.Text);
cmd.Parameters.AddWithValue("@p2", pic);
cmd.ExecuteNonQuery();

ここで記憶から引用しますが、そのコードで問題が発生した場合はお知らせください。私の記憶が正しければ、そのようなことがうまくいくはずです。

編集 - PictureBox コントロールに画像をプリロードしている場合は、その画像をバイト配列に変換し、そのバイト配列を 2 番目のパラメーターとして使用します。

編集 (2).- 少し説明。ファイルから画像を取得している場合は、そのパスがあります。その後、使用できますFile.ReadAllBytes(string path)。私の例では、操作yourFileNameが成功した後の選択されたファイルのファイルとパス名であると想定していましOpenDialogた。したがって、次のように使用できます。

byte[] fromPath = File.ReadAllBytes(@"C:\walls\aurora.jpg");

画像をバイト配列 fromPath に格納し、バイトに変換して、上記のように挿入コマンドで使用できるようにします。

ただし、画像ボックス コントロールから画像を取得する場合は、少し異なります。

MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, Imaging.ImageFormat.Jpeg);
byte[] fromControl = ms.GetBuffer();

この例では、 を作成しMemoryStream、picturebox コントロールのコンテンツを入力してバイト配列に渡しました。これで、挿入クエリのパラメーターとして使用する準備が整いました。

ああ、追加することを忘れないでください

using System.IO;
using System.Drawing;

あなたの使い方に。

于 2013-03-07T14:30:14.650 に答える