zoukankan      html  css  js  c++  java
  • c#中的HashTable和Dictionary

    问题描述:有A、B两张表,向A(aID,a,aa,aaa)、B(bID,aID,b,bb,bbb)表中同时插入一条数据。

    先向A表插入,再向B表插入。其中aID和bID都是自增的。

    用数据库事务时,用hashtable传递sql和parameter。由于hashtable取值时有无序性,造成B表插入数据时aID字段有时为null,有时不为null,具有随机性。

    修改前代码:

    /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
            public static void ExecuteSqlTranWithIndentity(Hashtable SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            int indentity = 0;
                            //循环
                            foreach (DictionaryEntry myDE in SQLStringList)
                            {
                                string cmdText = myDE.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.InputOutput)
                                    {
                                        q.Value = indentity;
                                    }
                                }
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.Output)
                                    {
                                        indentity = Convert.ToInt32(q.Value);
                                    }
                                }
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
     private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if (trans != null)
                    cmd.Transaction = trans;
                cmd.CommandType = CommandType.Text;//cmdType;
                if (cmdParms != null)
                {
    
    
                    foreach (SqlParameter parameter in cmdParms)
                    {
                        if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                            (parameter.Value == null))
                        {
                            parameter.Value = DBNull.Value;
                        }
                        cmd.Parameters.Add(parameter);
                    }
                }
            }
    

     修改后代码,改为dictionary传值,问题解决:

    /// <param name="sqlStringList">SQL语句的dictionary(key为sql语句,value是该语句的SqlParameter[])</param>
            public static int ExecuteSqlTranWithIndentity(IDictionary<string, SqlParameter[]> sqlStringList)
            {
                int flag = 0;
                string connectionString = ConfigHelper.GetConfigString("ConnectionString");
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            int indentity = 0;
                            
                            //循环
                            foreach (var myDE in sqlStringList)
                            {
                                string cmdText = myDE.Key;
                                SqlParameter[] cmdParms = myDE.Value;
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.InputOutput)
                                    {
                                        q.Value = indentity;
                                    }
                                }
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.Output)
                                    {
                                        indentity = Convert.ToInt32(q.Value);
                                    }
                                }
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
                return flag;
            }
    

    THE END

  • 相关阅读:
    如何实现Android重启应用程序代码 ?
    Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释
    WebView 和Animation冲突
    CopyOnWriteArrayList与Collections.synchronizedList的性能对比
    混淆后显示行号
    java 多线程操作List,已经做了同步synchronized,还会有ConcurrentModificationException,知道为什么吗?
    【2015年最新App Store退款流程详解】最详细AppStore退款流程图文教程
    Android 编程下 Touch 事件的分发和消费机制
    Android TouchEvent事件传递机制
    svn 规范apk的生成命名
  • 原文地址:https://www.cnblogs.com/bwlang/p/3069300.html
Copyright © 2011-2022 走看看