0

我已经研究了一段时间的删除功能,但我无法克服这个错误。

删除失败 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 查找特定的人。我认为问题不在于名称被传递,而更多在于它是如何传递的。

有任何想法吗?

4

3 回答 3

1

看起来像listBox1.SelectedItem.ToString()返回“SYSTEM”.“DATA”.“DATAROWVIEW”。您可能想要访问 的特定项目,DataRowViewSelectedItem不是整个 DataRowView 对象本身。也许listBox1.SelectedItem[0].ToString()是你想要的?

此外,您还必须添加 @Habib.OSU 提到的引号。

以及强制性的 sql 注入警告:不要将用户输入连接到 SQL 字符串中。它为SQL 注入攻击打开了大门。使用参数化查询。

于 2012-07-06T07:38:00.913 回答
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 注入

于 2012-07-06T07:40:22.630 回答
0

您在参数中缺少单引号

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

如果您可以使用参数化查询,那就更好了

于 2012-07-06T07:36:32.887 回答