2016-10-04 62 views
0

我有我從我看的教程中複製的代碼,我們的代碼在教程中非常相似。C#參數無效SQL

當演示者運行代碼時,它運行正常,但是當我嘗試運行與本教程中相同的代碼時,出現「參數無效」錯誤。

請幫幫

private void Viewbutton_Click(object sender, EventArgs e) 
    { 
     conection.Open(); 

     string sqlQuery = "select studnum, course, f_name, l_name, color_image from table3 where studnum='" + textBox1.Text + "'"; 

     cmd = new SqlCommand(sqlQuery, conection); 

     SqlDataReader dataread = cmd.ExecuteReader(); 
     dataread.Read(); 

     if (dataread.HasRows) 
     { 
      lblstudnum.Text = dataread[0].ToString(); 
      lblcourse.Text = dataread[1].ToString(); 
      lblfname.Text = dataread[2].ToString(); 
      lbllname.Text = dataread[3].ToString(); 
      byte[] images = (byte[])dataread[4]; 

      if(images==null) 
      { 
       pictureBox1.Image = null; 
      } 
      else 
      { 
       MemoryStream mstreem = new MemoryStream(images); 
       pictureBox1.Image = Image.FromStream(mstreem); 
      } 
     } 
     else 
     { 
      MessageBox.Show("this data not available"); 
     } 
    } 

誤差線是

pictureBox1.Image = Image.FromStream(mstreem); 
+6

您應該在'WHERE'子句中使用參數化查詢而不是連接。 –

+7

哪個教程建議使用字符串連接來構建sql查詢?使用參數化查詢。 –

+0

我發現本教程中的代碼https://www.youtube.com/watch?v=d7klnhcFBEg –

回答

1

最好使用參數的查詢和列名,而不是使用[0]的,[1]等。內存流是數據讀取器使用。所以你應該使用如下,提供有效的圖像保存在數據庫中

var con = new SqlConnection("the connection string to database"); 
    con.Open(); 

    SqlCommand cmd = new SqlCommand(@"sql query",con); 
    byte[] images = null; 
    using (SqlDataReader dataread = cmd.ExecuteReader()) 
    { 
     if (dataread.Read()) 
     { 
      //lblstudnum.Text = dataread[0].ToString(); 
      //lblcourse.Text = dataread[1].ToString(); 
      //lblfname.Text = dataread[2].ToString(); 
      //lbllname.Text = dataread[3].ToString(); 
      images = (byte[])dataread["color_image"];// column name is recommended 
     } 
    } 
    con.Close(); 
    if (images == null) 
    { 
     pictureBox1.Image = null; 
    } 
    else 
    { 
     MemoryStream mstreem = new MemoryStream(images); 
     pictureBox1.Image = Image.FromStream(mstreem); 
    } 
+0

我試試這些,它說「連接屬性尚未初始化」 –

+0

@andrewfaz:你找到解決方案 – GauravKP

0

可能不是一個有效的圖像。將一些調試代碼添加到您的程序中(或者設置一個watch),它將輸出內存流的長度及其前幾個字節。確保長度是你期望的。確保文件前綴在那裏(如果有的話),例如位圖文件有一個two-letter alphanumeric prefix。確保它沒有被截斷。確保它是一個allowed file format。問題可能是你的教師的數據庫中有數據,而你的數據庫沒有。

+0

是啊也許無效的圖像,但我保存在varbinary中,但現在我用圖像數據類型替換它,但它仍然是相同的錯誤 –

+0

我不是指數據類型,我指的是數據內容。 –

+0

也許作爲一種故障排除措施,您可以將程序更改爲[將圖像保存到文件](http://stackoverflow.com/questions/18766055/copy-memorystream-to-filestream-and-save-the-file),然後嘗試使用MS Paint打開它。如果您無法打開它,那麼您的數據有問題。 –