2015-10-18 70 views
0

我有一個包含3列的數據庫:FIRST_NAME,LAST_NAME和IMAGE。我總是得到錯誤「無效列名」第一列的名稱「。」我應該寫出第一個名字並點擊一個按鈕來顯示姓氏和圖像。我正在使用C#,這是我當前的代碼:從SQL數據庫檢索數據時出現「無效列名」錯誤?

 private void button_show_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      string sql = "select LAST_NAME,IMAGE from Table_1 where FIRST_NAME=" + this.firstname_textbox.Text + ""; 
      if (conn.State != ConnectionState.Open) 
       conn.Open(); 
      command = new SqlCommand(sql, conn); 
      SqlDataReader reader = command.ExecuteReader(); 
      reader.Read(); 
      if (reader.HasRows) 
      { 
       lastname_textbox.Text = reader[0].ToString(); 
       byte[] img = (byte[])(reader[1]); 
       if (img == null) 
       pictureBox1.Image = null; 
       else 
       { 
        MemoryStream ms = new MemoryStream(img); 
        pictureBox1.Image = Image.FromStream(ms); 
       } 

      } 
      else 
      { 
       MessageBox.Show("This Name Does Not Exist"); 
      } 
      conn.Close(); 
     } 
     catch(Exception ex) 
     { 
      conn.Close(); 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

謝謝。

+1

警告!永遠不要連接輸入字段的查詢,因爲您容易受到[SQL注入攻擊](https://en.wikipedia.org/wiki/SQL_injection)的影響。改爲使用參數化查詢 – dotnetom

回答

2

在WHERE子句中有一個未加引號的字符串。

string sql = "select LAST_NAME,IMAGE from Table_1 where FIRST_NAME=" + this.firstname_textbox.Text + ""; 

應該是:

string sql = "select LAST_NAME,IMAGE from Table_1 where FIRST_NAME='" + this.firstname_textbox.Text + "'"; 

你也應該知道,使用字符串連接的SQL查詢參數是不好的做法,因爲它創建了一個SQL注入漏洞。例如,想象的結果,如果this.firstname_textbox.Text是:

';DELETE FROM Table_1 WHERE '1' = '1 

這將導致變量「SQL」是這樣的:

select LAST_NAME,IMAGE from Table_1 where FIRST_NAME='';DELETE FROM Table_1 WHERE '1' = '1' 

爲了避免此問題,使用參數化查詢(https://msdn.microsoft.com/en-us/library/vstudio/bb738521%28v=vs.100%29.aspx

+0

非常感謝,不知何故,我沒有注意到。非常感謝... –

+0

@ Tarek-Dev您的歡迎,我很高興我的答案是可以接受的。 – AlVaz

相關問題