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" を返すように見えます。おそらく、DataRowView オブジェクト自体全体ではなく、DataRowViewの特定の項目にアクセスする必要があります。SelectedItem多分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 に答える