0

ASP.NET 2.0 Web サイトから Oracle 10g データベースのデータを削除する必要があります。

メソッドDeleteMonthPlan 削除コマンドの実行時に使用します。問題は、このコマンドが「ブラウザで」長時間実行され、最終的に削除コマンドが実行されないことです。多分それはコミットを待っていますか?問題の根本とは?

この SQL コマンド DELETE C_PPC_PLAN WHERE MFG_MONTH='VALUE' は OK です。

MFG_MONTH 列の型は VARCHAR2(16) です

最初にメソッド DeleteMonthPlan を呼び出す必要があり、次に InsertDatePlan を呼び出す必要があります。

    private static void DeleteMonthPlan(string monthIndex)
    {
        try
        {
            using (var conn = new OracleConnection(GenerateConnectionString()))
            {
                conn.Open();

                var cmd = conn.CreateCommand();

                cmd.CommandText = string.Format("DELETE C_PPC_PLAN WHERE MFG_MONTH='{0}'", monthIndex);

                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception exception)
        {

            throw exception;
        }
    }

たとえば、挿入時に使用するこのメソッドは問題ありません。

    public void InsertDatePlan(DatePlan dp, 
        string monthIndex)
    {
        DeleteMonthPlan(monthIndex);
        try
        {
            using (var conn = new OracleConnection(GenerateConnectionString()))
            {
                conn.Open();

                var cmd = conn.CreateCommand();

                cmd.Parameters.Add(":Site", OracleType.VarChar).Value = dp.Site;
                cmd.Parameters.Add(":Week", OracleType.VarChar).Value = dp.MfgWeek;
                cmd.Parameters.Add(":Month", OracleType.VarChar).Value = dp.MfgMonth;
                cmd.Parameters.Add(":Year", OracleType.VarChar).Value = dp.MfgYear;
                cmd.Parameters.Add(":Input", OracleType.Number).Value = dp.Input;
                cmd.Parameters.Add(":Output", OracleType.Number).Value = dp.Output;
                cmd.Parameters.Add(":LMUser", OracleType.VarChar).Value = dp.LmUser;
                cmd.Parameters.Add(":PartNo", OracleType.VarChar).Value = dp.PartNo;
                cmd.Parameters.Add(":PartNoDesc", OracleType.VarChar).Value = dp.PartNoDesc;


                cmd.CommandText = string.Format("INSERT INTO C_PPC_PLAN (CREATE_TIME, SITE, MFG_DAY,MFG_WEEK,MFG_MONTH,MFG_YEAR,INPUT,OUTPUT,LM_TIME,LM_USER,PART_NO,PART_NO_DESC)"
                            + " VALUES (to_date('{0}', 'dd-mm-yyyy hh24:mi:ss'), :Site ,to_date('{1}', 'dd-mm-yyyy hh24:mi:ss'),:Week,"
                            + ":Month,:Year,:Input,:Output,to_date('{2}', 'dd-mm-yyyy hh24:mi:ss'),:LMUser,:PartNo,:PartNoDesc)"
                            , dp.CreateTime, dp.MfgDate, dp.LmTime);

                cmd.ExecuteNonQuery();

            }
        }
        catch (Exception exception)
        {

            throw exception;
        }
    }

トランザクションを使用してみました。一番下でこのメソッドを呼び出しますが、決して終了しないということは、その部分を意味します

trans.Rollback(); or conn.Close();実行されることはありません。

    private static void DeleteMonthPlan(string monthIndex)
    {
        var conn = new OracleConnection(GenerateConnectionString());
        conn.Open();

        OracleCommand cmd= conn.CreateCommand();

        OracleTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);
        cmd.Transaction = trans;

        try
        {
            cmd.CommandText = "DELETE C_PPC_PLAN WHERE MFG_MONTH='6'";
            cmd.ExecuteNonQuery();
            trans.Commit();

        }
        catch (Exception e)
        {
            trans.Rollback();
        }
        finally
        {
            conn.Close();
        }
    }
4

1 に答える 1

1

試す

DELETE FROM C_PPC_PLAN WHERE MFG_MONTH='6'

ところで、コードはいくつかの場所でバインド変数 (params) の代わりに「リテラル」を使用しているため、SQL インジェクションに対して脆弱であり、これは非常に深刻なセキュリティ上の問題です!

于 2011-10-10T08:44:17.633 に答える