2015-10-18 124 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

相关问题