【问题标题】:SQL Query issues: invalid identifierSQL 查询问题:标识符无效
【发布时间】:2012-07-06 07:33:00
【问题描述】:

我一直在研究删除功能,但我无法克服这个错误。

删除失败 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 查找特定人员。我认为问题不在于传递的名称,而在于传递的方式。

有什么想法吗?

【问题讨论】:

  • 看起来你在 DELETE FROM CLIENT WHERE (CLI_LNAME = '" + listBox1.SelectedItem.ToString() + "') 中忘记了一些 ' 现在你的 CLI_LNAME 似乎是一个字符串类型
  • 表中真的有CLI_NAME 列吗?并且名称应该用单引号括起来,这就是为什么使用参数化查询很好
  • 就是这样.. 这么简单的事情。我一定很累。谢谢。

标签: c# sql database oracle


【解决方案1】:

您的查询被翻译成

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

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

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

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

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

【讨论】:

  • 现在阅读。感谢您的意见。
【解决方案2】:

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

您还必须像@Habib.OSU 提到的那样添加引号。

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

【讨论】:

  • 注明。感谢您的警告。
【解决方案3】:

参数中缺少单引号

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

如果你能使用Parameterized query就更好了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多