2012-07-06 71 views
0

我一直在做一段时间的删除功能,而且我无法越过这个错误。SQL查询问题:无效标识符

删除失败ORA-00904“系统”“数据”“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); 
      } 
     } 
    } 

在数据库中的表是客户端和我试图通过自己的姓氏找到一个特定的人或CLI_LNAME。我认为问题不在于通过名称,而在于如何通过。

任何想法?

+1

它看起来就像你在'DELETE从客户WHERE忘记一些“文本( CLI_LNAME ='“+ listBox1.SelectedItem.ToString()+”')'现在你的CLI_LNAME似乎是一个字符串类型 – Heki 2012-07-06 07:35:54

+0

你真的在表中有'CLI_NAME'列吗?并且该名称应该被包含在**单引号**中,这就是为什么它使用参数化查询的好处 – V4Vendetta 2012-07-06 07:37:59

+0

就是这样..这么简单。我一定很累。 谢谢。 – Uzzy58321 2012-07-06 07:42:28

回答

0

您在参数

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

其更好缺少单引号,如果你能使用Parameterized query

1

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

此外,您必须添加报价为@ Habib.OSU提及。

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

+0

已注意。谢谢你的提醒。 – Uzzy58321 2012-07-06 07:45:48

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注入

+0

立即阅读。感谢您的输入。 – Uzzy58321 2012-07-06 07:47:40