首页 新闻 会员 周边 捐助

C#里如何批量执行sql

0
悬赏园豆:10 [已解决问题] 解决于 2017-05-21 23:18

c#里边如何批量执行参数化的update,insert语句,因为有多条update或者insert语句,每条语句的参数都是一样的,只是参数值不一样,现在有没有好的办法把这些sql放在一起一起提交给数据库执行,现在是一条条的执行的,如果不用参数化是完全可以组装sql的,但是那样反而有sql注入的问题,求大神解答?

c#
tuohaibei的主页 tuohaibei | 初学一级 | 园豆:46
提问于:2016-10-30 22:11
< >
分享
最佳答案
1

我记得参数化的时候,参数是可以重复使用的。也就是一样可以拼好SQL语句,因为你每条的参数都是一样的。

收获园豆:10
盟怀部孩 | 小虾三级 |园豆:878 | 2016-11-01 17:02

是的,参数化的时候允许有多个一样的参数传递.

tuohaibei | 园豆:46 (初学一级) | 2017-05-21 23:14
其他回答(4)
0

存储过程,把你实参拼接后带进去在split开搞

Daniel Cai | 园豆:10424 (专家六级) | 2016-10-31 00:18

怎么找准对应的insert,update呢

支持(0) 反对(0) tuohaibei | 园豆:46 (初学一级) | 2016-10-31 16:38

@tuohaibei: 这个是你的逻辑了啊。你把逻辑从代码中移到tsql中。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-31 16:57

@Daniel Cai: 那还是不优雅,哈哈。

支持(0) 反对(0) tuohaibei | 园豆:46 (初学一级) | 2019-08-05 00:11
0

如果这些操作互相影响最好还是用触发器或者事务,安全可靠

~扎克伯格 | 园豆:1923 (小虾三级) | 2016-10-31 09:11

触发器怎么去解决呢?

支持(0) 反对(0) tuohaibei | 园豆:46 (初学一级) | 2016-10-31 16:37

@tuohaibei: 前提是这些操作要互相影响的,比如你的更新操作会影响到插入操作

支持(0) 反对(0) ~扎克伯格 | 园豆:1923 (小虾三级) | 2016-10-31 16:40
0

一条一条执行也是很快的,前提是你不要把connection给关掉,你要让他一直开着

刘宏玺 | 园豆:14020 (专家六级) | 2016-10-31 09:17
0

忍不住写一发给你,假如我们一个有对象是SqlModel,它有属性Sql,InParas等,这是用来存sql语句和其对应的参数的。

public long ExecuteTrans(List<SqlModel> listSqlModel)
        {
            long count = 0;
            string sql1 = "";
            DbParameter[] paras1 = null;
            using (OracleConnection orclCon = new OracleConnection(ConnectionStringReady))
            {
                if (orclCon.State == ConnectionState.Closed)
                {
                    orclCon.Open();
                }
                using (OracleCommand cmd = orclCon.CreateCommand())
                {
                    OracleTransaction trans = orclCon.BeginTransaction();
                    cmd.Transaction = trans;
                    try
                    {

                        foreach (SqlModel m in listSqlModel)
                        {
                            sql1 = m.Sql;
                            paras1 = m.InParas;
                            if (m.IsProcedure)
                            {
                                cmd.CommandType = CommandType.StoredProcedure;
                            }
                            else
                            {
                                cmd.CommandType = CommandType.Text;
                            }
                            cmd.CommandText = m.Sql.Trim();
                            cmd.Parameters.Clear();
                            if (m.InParas != null)
                            {
                                for (int i = 0; i < m.InParas.Length; i++)
                                {
                                    if (m.InParas[i].Value == null)
                                    {
                                        m.InParas[i].Value = DBNull.Value;
                                    }
                                    cmd.Parameters.Add(m.InParas[i]);
                                }
                            }
                            if (m.IsProcedure&&m.OutParas != null)
                            {
                                for (int i = 0; i < m.OutParas.Length; i++)
                                {
                                    if (m.OutParas[i].Value == null)
                                    {
                                        m.OutParas[i].Value = DBNull.Value;
                                    }
                                    m.OutParas[i].Direction = ParameterDirection.Output;
                                    cmd.Parameters.Add(m.OutParas[i]);
                                }
                            }
                            count +=cmd.ExecuteNonQuery();
                        }
                        trans.Commit();
                        return count;
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        throw ex;
                    }
                }
            }
        }

 

ensleep | 园豆:1682 (小虾三级) | 2016-11-01 21:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册