【问题标题】:Delete in oracle 10g from asp.net web site - wait on commint?从 asp.net 网站删除 oracle 10g - 等待 commint?
【发布时间】:2011-10-02 13:35:17
【问题描述】:

我需要从 ASP.NET 2.0 网站删除 oracle 10g 数据库中的数据。

方法 DeleteMonthPlan 我在执行删除命令时使用。问题是该命令在“浏览器中”执行了很长时间,最后没有执行删除命令。也许它等待提交?问题的根源是什么?

这个 SQL 命令 DELETE C_PPC_PLAN WHERE MFG_MONTH='VALUE' 是可以的。

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();
        }
    }

【问题讨论】:

  • 你能解释一下“最终删除命令没有执行”是什么意思吗?是否超时?它会返回错误吗?如果是这样,什么错误?它是否运行但不删除任何行?或者是其他东西?您可以通过其他一些交互式工具(即 SQL*Plus)运行相同的 DELETE 语句吗?它在那种环境下运行得更快吗?
  • 它仍在运行,例如 5 分钟,但表中没有删除记录...我没有收到错误。我使用 PL/SQL 测试这个命令并且它有效。

标签: c# asp.net oracle sql-delete oracle-xe


【解决方案1】:

试试

DELETE FROM C_PPC_PLAN WHERE MFG_MONTH='6'

顺便说一句,您的代码在某些地方使用“文字”而不是绑定变量(参数),这使得它容易受到 SQL 注入的影响,这是一个非常严重的安全问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多