2011-07-24 11 views
-1

メモリストリームからデータベースから画像を取得すると、エラーParameter is not validが返されることがあります。この問題から私を助けてください。SQL Serverデータベースから画像を取得する

コード:

private void button3_Click(object sender, EventArgs e) 
{ 
    string strcon = "Data Source=PINKAL-PC; initial catalog=testing; integrated security=SSPI;"; 

    SqlConnection sqlcon = new SqlConnection(strcon); 
    sqlcon.Open(); 

    string strquery = "select * from testimg"; 

    SqlDataAdapter da = new SqlDataAdapter(strquery,sqlcon); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 

    DataTable dt = new DataTable(); 
    dt = ds.Tables[0]; 

    byte[] barrImg = (byte[])dt.Rows[7]["image"]; 
    MemoryStream mstream = new MemoryStream(barrImg); 

    pictureBox2.Image = Image.FromStream(mstream); 
} 
+2

エラーが発生した行はありますか。 – Tim

+0

あなたのテーブル 'testimg'にはどの**列**が含まれていますか?ほとんどの場合、データにアクセスするときに列名のスペルを間違えただけです。 –

答えて

2

なく、あなたの問題の実際の根本的な原因が何であるかを確認してください - 私の推測では、データベースのテーブルtestimgimageの名前で何の列が存在しないということでしょう、しかし、あなたがしようとしていますあなたの写真を得るためにその列を読むこと。あなたのエラーがストリームに、データベースから画像を変換に関係している場合

private void button3_Click(object sender, EventArgs e) 
{ 
    string strcon = "Data Source=PINKAL-PC; initial catalog=testing; integrated security=SSPI;"; 

    // Put your SqlConnection into using blocks to ensure proper disposal 
    using(SqlConnection sqlcon = new SqlConnection(strcon)) 
    { 
    // sqlcon.Open(); -- don't open it here already - open as LATE as possible.... 
    // for SqlDataAdapter - you don't even need to open it yourself - 
    // the data adapter will do this automatically for you 
    // and **IF** you open it yourself - you also need to CLOSE it again! 

    // *NEVER* use SELECT * in code !! specify the columns you want explicitly 
    // string strquery = "select * from testimg"; 
    string strquery = "SELECT col1, col2, col3 ..... FROM dbo.testimg"; 

    SqlDataAdapter da = new SqlDataAdapter(strquery, sqlcon); 

    //DataSet ds = new DataSet(); if you only want a single DataTable - no point in having a whole DataSet ! That's just overhead..... 
    //da.Fill(ds); 
    //DataTable dt = new DataTable(); 
    //dt = ds.Tables[0]; 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 

    // is there a "image" column in your table?? 
    // You need to use the proper column name here! 
    byte[] barrImg = (byte[])dt.Rows[7]["image"]; 
    MemoryStream mstream = new MemoryStream(barrImg); 

    pictureBox2.Image = Image.FromStream(mstream); 
    } 
} 
+0

問題は同じままで、列名とデータベース名は正しいです。私はこのために何をすべきですか? – user721563

+0

@ user721563:あなたのテーブルの構造を教えてくれますか?列名とデータ型?? –

0

、ちょうどこのようなあなたのコードを変更しよう:

しかし、ここでは、私は、一般的にあなたのコードのためにお勧めしたいいくつかのことです。 :

byte[] barrImg = (byte[])dt.Rows[7]["image"]; 

MemoryStream mstream = new MemoryStream(); 

mstream .Write (barrImg, 0, barrImg.Length);  
mstream .Seek (0, SeekOrigin.Begin);   
mstream .Close(); 

pictureBox2.Image = Image.FromStream(mstream); 
+0

クローズドストリームからオブジェクトにアクセスしようとしているのはなぜですか?これはどのように働くと思われますか? – Debaprasad

関連する問題