我一直在研究删除功能一段时间了,我无法解决这个错误。
删除失败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查找特定的人。我认为问题不在于传递的名称,而在于它的传递方式。
有什么想法吗?
答案 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
,效果会更好