SQL查询问题:标识符无效

时间:2012-07-06 07:33:01

标签: c# sql database oracle

我一直在研究删除功能一段时间了,我无法解决这个错误。

删除失败ORA-00904“SYSTEM”。“DATA”。“DATAROWVIEW”:无效标识符

    private void button3_Click(object sender, EventArgs e)
    {
        string yesNoPrompt = "Are you sure you want to delete this patient?";
        const string caption = "";
        var result = MessageBox.Show(yesNoPrompt, caption,
                                     MessageBoxButtons.YesNo,
                                     MessageBoxIcon.Question);

        if (result == DialogResult.Yes)
        {
            string sql = "DELETE FROM CLIENT WHERE (CLI_LNAME =" + listBox1.SelectedItem.ToString() + ")" ;

            try
            {
                string connectionString = GetConnectionString();
                using (OracleConnection connection = new OracleConnection())
                {
                    connection.ConnectionString = connectionString;
                    connection.Open();

                    OracleCommand command = new OracleCommand(sql, connection);
                    command.CommandType = CommandType.Text;
                    command.ExecuteNonQuery();

                }
            }
            catch (System.Data.OracleClient.OracleException ex)
            {
                MessageBox.Show("Delete Failed" + ex.Message);
            }
        }
    }

数据库中的表是CLIENT,我正在尝试按姓氏或CLI_LNAME查找特定的人。我认为问题不在于传递的名称,而在于它的传递方式。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

看起来listBox1.SelectedItem.ToString()返回“SYSTEM”。“DATA”。“DATAROWVIEW”。您可能希望访问DataRowView的{​​{1}}的特定项,而不是整个DataRowView对象本身。也许SelectedItem就是你想要的?。

此外,你必须添加@Habib.OSU提及的引号。

强制性sql注入警告:不要将用户输入连接到SQL字符串。它为SQL injection attacks打开了。使用参数化查询。

答案 1 :(得分:1)

您的查询已转换为

DELETE FROM CLIENT WHERE (CLI_LNAME = SYSTEM.DATA.DATAROWVIEW)

由于缺少单引号,因此它试图找到SYSTEM.DATA.DATAROWVIEW表中不存在的名为Client的列。因此错误。

当您使用单引号时,它会查找该特定列中的文本

DELETE FROM CLIENT WHERE (CLI_LNAME = 'PatientName') // Now its not a column as such

使用参数化查询来避免SQL注入

答案 2 :(得分:0)

你缺少参数中的单引号

string sql = "DELETE FROM CLIENT WHERE (CLI_LNAME ='" + listBox1.SelectedItem.ToString() + "')" ;

如果您可以使用Parameterized query

,效果会更好