4

ADO.NET、C#を使用してWebフォームからデータベースに値を挿入しています。私が使用しているDBはOracleデータベースです。値が挿入されておらず、プログラムはcmd.ExecuteNonquery()で攻撃されます

以下に私のコードがあります。何か間違いをしている場合はお知らせください。いくつかの静的メソッドを使用していますが、問題はありますか?..

public Boolean AddDivCo(Int32 UserNo,String ID, String Role, String DivName )
{
    Boolean ret = false;


    OracleCommand cmd = new OracleCommand();
    OracleConnection conn = new OracleConnection();
    int i = 0;

    try
    {
        conn.ConnectionString = ConfigurationManager.ConnectionStrings["Conn_RIS"].ConnectionString;
        conn.Open();

        cmd.Connection = conn;
        String mySQL = "INSERT INTO R4CAD_ADMIN (AdminUserNo, AdminID, AdminRole, AdminDivName)VALUES(:AdminUserNo,:AdminID,:AdminRole,:DivName)";

        OracleParameter p1 = new OracleParameter("AdminUserNo", OracleType.Number);
        p1.Value = UserNo;
        cmd.Parameters.Add(p1);

        OracleParameter p2 = new OracleParameter("AdminID", OracleType.VarChar);
        p2.Value = ID;
        cmd.Parameters.Add(p2);

        OracleParameter p3 = new OracleParameter("AdminRole", OracleType.VarChar);
        p3.Value = Role;
        cmd.Parameters.Add(p3);

        OracleParameter p4 = new OracleParameter("DivName", OracleType.VarChar);
        p4.Value = DivName;
        cmd.Parameters.Add(p4);

        cmd.CommandText = mySQL;

        i = cmd.ExecuteNonQuery();

        if (i != 0)
        {
            ret = true;
        }
        else
        {
            ret = false;
        }
    }
    catch (Exception err)
    {
        Console.WriteLine(err.Message.ToString());
    }
    finally
    {
        cmd.Dispose();
        //cmd = null;
        //conn = null;
        conn.Close();
    }
    return ret;
}
4

1 に答える 1

3

このテーブルに定義されている主キーはありますか?もしそうなら、私の推測では、このキーでレコードをすでに挿入しているが、コミットまたはロールバックでトランザクションをまだ終了していない別のセッションがあります。私はあなたのコードの一部としてコミットを見ていません-私はあなたがどこかでそれをしていると思いますか?

上記のコードをもう一度実行し、ハングしている間に別のセッションから次のクエリを実行します。

SELECT
      (SELECT username FROM v$session WHERE sid=a.sid) blocker,
       a.sid,
      ' is blocking ',
       (SELECT username FROM v$session WHERE sid=b.sid) blockee,
           b.sid
  FROM v$lock a JOIN v$lock b ON (a.id1 = b.id1 AND a.id2 = b.id2)
 WHERE a.block = 1
   AND b.request > 0;

これにより、別のセッションによってブロックされているかどうか、およびそのセッションのSIDが何であるかがわかります。

于 2010-07-12T14:47:06.573 に答える