jQuery MiniUI

 找回密码
 立即注册
查看: 3743|回复: 8
打印 上一主题 下一主题

treegrid提交的数据,做数据插入时,如何拼成一条SQL语句 [复制链接]

Rank: 3Rank: 3

跳转到指定楼层
楼主
发表于 2014-2-23 23:30:39 |只看该作者 |倒序浏览
本帖最后由 webyao 于 2014-2-23 23:31 编辑

treegrid提交的数据,做数据插入时,想把Hashtable user中的数据拼成一条SQL语句要怎么传递参数。
在事务里需要在同一连接下传递一批SQL语句,参数不好传递,在业务逻辑层,拼接时参数该如何传?
public static int ExecuteSqlTran(List<String> SQLStringList)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            count += cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    return count;
                }
                catch
                {
                    tx.Rollback();
                    return 0;
                }
            }
        }

参照了private static void SetArgs(string sql, Hashtable args, IDbCommand cmd),但需要把Hashtable user整体作为参数传递。能不能直接在业务逻辑层,直接拼成一条SQL语句?
我试过这样传,可第二条sql语句的参数,读不到
public static int ExecuteSqlTran(List<String> SQLStringList, Hashtable args)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                  
                    int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                             MatchCollection ms = Regex.Matches(strsql, @"@\w+");
                               int i = 1;
                                foreach (Match m in ms)
                                {
                                    string key = m.Value;
                                    Object value = args[key];
                                    if (value == null)
                                    {
                                        value = args[key.Substring(1)];
                                    }
                                    if (value == null) value = DBNull.Value;
                                    cmd.Parameters.Add(new SqlParameter(key, value));
                                }
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    return count;
                }
                catch
                {
                    tx.Rollback();
                    return 0;
                }
            }
        }

Rank: 8Rank: 8

沙发
发表于 2014-2-24 09:31:57 |只看该作者
遍历hashtable用foreach

Rank: 3Rank: 3

板凳
发表于 2014-2-24 10:07:57 |只看该作者
factory 发表于 2014-2-24 09:31
遍历hashtable用foreach

foreach遍历只能完成一条sql语句的参数,第二条语句就不知该如何了?
public static int ExecuteSqlTran(List<String> SQLStringList)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            count += cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    return count;
                }
                catch
                {
                    tx.Rollback();
                    return 0;
                }
            }
        }
这个该如何修改一下可以接受一个参数列表呢

Rank: 3Rank: 3

地板
发表于 2014-2-24 10:12:58 |只看该作者
webyao 发表于 2014-2-24 10:07
foreach遍历只能完成一条sql语句的参数,第二条语句就不知该如何了?
public static int ExecuteSqlTran( ...

在网上找了个支持参数的事务,但是oracle的
/// <summary>
        /// sql语句及参数列表(存放要执行Sql语句及其对应的参数)
        /// </summary>
        public struct sttSqlList
        {
            private string sSQl;
            /// <summary>
            /// SQl语句
            /// </summary>
            public string atbSQl
            {
                get
                {
                    return sSQl;
                }
                set
                {
                    sSQl = value;
                }
            }
            sttSqlParameterList[] splList;
            /// <summary>
            /// 参数列表
            /// </summary>
            public sttSqlParameterList[] atbSqlPraList
            {
                get
                {
                    return splList;
                }
                set
                {
                    splList = value;
                }
            }
        }


        /// <summary>
        /// 参数列表,用于存放参数
        /// </summary>
        public struct sttSqlParameterList
        {
            private string sName;
            private string sType;
            private string sValue;

            /// <summary>
            /// 构造函数(初始化值)
            /// </summary>
            /// <param name="asName">参数名</param>
            /// <param name="asType">参数类型(暂时只针对string型的值)</param>
            /// <param name="asValue">参数值</param>
            public sttSqlParameterList(string asName, string asType, string asValue)
            {
                sName = asName;
                sType = asType;
                sValue = asValue;
            }

            /// <summary>
            /// 参数名(与SQL语句中的参数名相同,但不带:号)
            /// </summary>
            public string Name
            {
                get
                {
                    return sName;
                }
                set
                {
                    sName = value;
                }
            }

            /// <summary>
            /// 参数类型(本参数暂时只接受string型)
            /// </summary>
            public string Type
            {
                get
                {
                    return sType;
                }
                set
                {
                    sType = value;
                }
            }

            /// <summary>
            /// 参数值,与参数类型对应
            /// </summary>
            public string Value
            {
                get
                {
                    return sValue;
                }
                set
                {
                    sValue = value;
                }
            }
        }

        /// <summary>
        /// 执行事务(传入语句列表)
        /// </summary>
        /// <param name="sSqlList">一次执行的多条语句列表</param>
        public static int ExecParameterTransaction(List<sttSqlList> aSqlList)
        {
            //影响的值
            int iExecCou = 0;
            string sConnectionString = ConfigurationManager.AppSettings.Get("UserConnection");
            OracleConnection ocConnection = new OracleConnection(sConnectionString);
            ocConnection.Open();
            //创建并开启事务
            using (OracleTransaction oraTrans = ocConnection.BeginTransaction(IsolationLevel.ReadCommitted))
            {
                OracleCommand ocCommand = ocConnection.CreateCommand();
                ocCommand.Transaction = oraTrans;
                try
                {
                    //执行多表SQL
                    foreach (sttSqlList sttItemSql in aSqlList)
                    {
                        //清除参数(为执行下一条语句作准备)
                        ocCommand.Parameters.Clear();
                        //要执行的语句
                        ocCommand.CommandText = sttItemSql.atbSQl;
                        sttSqlParameterList[] sttPraList = sttItemSql.atbSqlPraList;
                        for (int i = 0; i < sttPraList.Length; i++)
                        {
                            OracleParameter opName = new OracleParameter();
                            opName.ParameterName = sttPraList.Name;
                            switch (sttPraList.Type)
                            {
                                case "string":
                                    opName.OracleType = OracleType.VarChar;
                                    break;
                                default:
                                    opName.OracleType = OracleType.VarChar;
                                    break;
                            }
                            opName.Value = sttPraList.Value;
                            //增加参数
                            ocCommand.Parameters.Add(opName);
                        }
                        //执行
                        iExecCou += ocCommand.ExecuteNonQuery();
                    }
                  
                    //完成后确认事务
                    oraTrans.Commit();
                }
                catch (Exception ex)
                {
                    //出错后回滚事务
                    oraTrans.Rollback();
                    throw ex;
                }
                finally
                {
                    ocCommand.Dispose();
                    ocConnection.Close();
                }
            }
            return iExecCou;
        }
这个要修改成SQL版本的hashtable参数可以直接传递吗要怎么修改呢,我不懂oracle求帮助?

Rank: 8Rank: 8

5#
发表于 2014-2-24 10:13:48 |只看该作者
webyao 发表于 2014-2-24 10:07
foreach遍历只能完成一条sql语句的参数,第二条语句就不知该如何了?
public static int ExecuteSqlTran( ...

你有一个arraylist.你先遍历arralist, 再获得到hashtable之后,再foreach获取hashtable的各个字段

Rank: 3Rank: 3

6#
发表于 2014-2-24 10:21:13 |只看该作者
factory 发表于 2014-2-24 10:13
你有一个arraylist.你先遍历arralist, 再获得到hashtable之后,再foreach获取hashtable的各个字段 ...

你说的是这个意思吗?
public static int ExecuteSqlTran(List<String> SQLStringList, Hashtable args)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                  
                    int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                             MatchCollection ms = Regex.Matches(strsql, @"@\w+");
                               int i = 1;
                                foreach (Match m in ms)
                                {
                                    string key = m.Value;
                                    Object value = args[key];
                                    if (value == null)
                                    {
                                        value = args[key.Substring(1)];
                                    }
                                    if (value == null) value = DBNull.Value;
                                    cmd.Parameters.Add(new SqlParameter(key, value));
                                }
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    return count;
                }
                catch
                {
                    tx.Rollback();
                    return 0;
                }
            }
        }

用foreach遍历,传参过来的时候,hashtable里如何放多条语句的参数,我试过在业务层用ADD的方法添加可没有成功

Rank: 8Rank: 8

7#
发表于 2014-2-24 12:59:12 |只看该作者
webyao 发表于 2014-2-24 10:21
你说的是这个意思吗?
public static int ExecuteSqlTran(List SQLStringList, Hashtable args)
         ...

调试看下呢,hashtable内部字段数据是否读取正确了

Rank: 3Rank: 3

8#
发表于 2014-2-24 14:39:34 |只看该作者
factory 发表于 2014-2-24 12:59
调试看下呢,hashtable内部字段数据是否读取正确了

循环第一次是正确的,第二次就有问题了,调试的方法不会,我是分别把SQL语句单独传入测试的,单独一条语句没有问题测试能执行数据也能写到数据库,只要两条一起传入就有问题了!

Rank: 8Rank: 8

9#
发表于 2014-2-24 15:42:35 |只看该作者
webyao 发表于 2014-2-24 14:39
循环第一次是正确的,第二次就有问题了,调试的方法不会,我是分别把SQL语句单独传入测试的,单独一条语 ...

你具体还是后台断点调试看看吧,第二条为什么不行,光说我也不能确定到底哪里出了问题

Archiver|普加软件

GMT+8, 2024-9-29 07:21 , Processed in 1.042858 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部