【问题标题】:"invalid column name" error when retrieving data from SQL database?从 SQL 数据库中检索数据时出现“无效的列名”错误?
【发布时间】:2016-01-17 01:19:33
【问题描述】:

我有一个包含 3 列的数据库:FIRST_NAME、LAST_NAME 和 IMAGE。我总是收到错误“无效的列名'第一列的名称'。”我应该写下名字并单击一个按钮以显示姓氏和图像。我正在使用 C#,这是我当前的代码:

        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);
        }
    }
}

谢谢。

【问题讨论】:

  • 警告!永远不要从输入字段连接您的查询,因为您很容易受到SQL Injection attack 的攻击。改用参数化查询

标签: c# sql database data-retrieval


【解决方案1】:

您的 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)

【讨论】:

  • @Tarek-Dev 欢迎您,很高兴我的回答能被您接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多