c# 把DataTable中数据批量导入新的sqlite的db文件中

  1. 需求 : 使用sqlite数据库, 将文件A.db 中某张数据表的数据,备份到文件B.db中。
    解决方案:
  2. 使用dataTableUpdate。不推荐
  3. 可以使用事务进行批量处理。
    目的: 避免手动拼接大量insert into sql语句,直接将dataTable 作为参数,实现批量插入。

主要代码逻辑,及调用方式如下。

    //建表
     string createSql = $"CREATE TABLE {table}" +
               "(EPC varchar(32),UID  varchar(20),q_time varchar(8),flag INTEGER," +
               " PRIMARY KEY(EPC, UID, q_time))";
            SqlHelper.ExecuteNonQuery(createSql);
            //insert 语句
             string commandText = $"INSERT INTO {table}(EPC,UID,q_time,flag)VALUES(@EPC,@UID,@q_time,@flag)";
            SqlHelper.ExecuteMutliQuery(commandText, dt);

    
    调用方法
        public int ExecuteMutliQuery(string commandText, DataTable dtData)
        {
            int res = 0;
            if (Conn.State == ConnectionState.Closed)
                Conn.Open();
            using (SQLiteTransaction dbTrans = Conn.BeginTransaction())
            {
                try
                {
                    foreach (DataRow row in dtData.Rows)
                    {
                        res += ExecuteNonQuery(dbTrans, commandText, row.ItemArray);
                    }
                    dbTrans.Commit();
                }
                catch (Exception ex)
                {
                    res = -1;
                    dbTrans.Rollback();
                    throw ex;
                }
                finally
                {
                    //Conn.Close();
                }
            }
            return res;
        }

///调用方法
 public int ExecuteNonQuery(SQLiteTransaction transaction, string commandText, params object[] paramList)
        {
            if (transaction == null) throw new ArgumentNullException("transaction is null");
            if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rolled back or committed,please provide an open transaction.", "transaction");
            using (IDbCommand cmd = transaction.Connection.CreateCommand())
            {
                cmd.CommandText = commandText;
                AttachParameters((SQLiteCommand)cmd, cmd.CommandText, paramList);
                if (transaction.Connection.State == ConnectionState.Closed)
                    transaction.Connection.Open();
                int result = cmd.ExecuteNonQuery();
                return result;
            }
        }


  #region AttachParameters(SQLiteCommand,commandText,object[] paramList)
        /// <summary>
        /// 增加参数到命令(自动判断类型)
        /// </summary>
        /// <param name="commandText">命令语句</param>
        /// <param name="paramList">object参数列表</param>
        /// <returns>返回SQLiteParameterCollection参数列表</returns>
        private SQLiteParameterCollection AttachParameters(SQLiteCommand cmd, string commandText, params object[] paramList)
        {
            if (paramList == null || paramList.Length == 0) return null;

            SQLiteParameterCollection coll = cmd.Parameters;
            string parmString = commandText.Substring(commandText.IndexOf("@"));
            // pre-process the string so always at least 1 space after a comma.
            parmString = parmString.Replace(",", " ,");
            // get the named parameters into a match collection
            string pattern = @"(@)\S*(.*?)\b";
            Regex ex = new Regex(pattern, RegexOptions.IgnoreCase);
            MatchCollection mc = ex.Matches(parmString);
            string[] paramNames = new string[mc.Count];
            int i = 0;
            foreach (Match m in mc)
            {
                paramNames[i] = m.Value;
                i++;
            }

            // now let's type the parameters
            int j = 0;
            Type t = null;
            foreach (object o in paramList)
            {
                t = o.GetType();

                SQLiteParameter parm = new SQLiteParameter();
                switch (t.ToString())
                {

                    case ("DBNull"):
                    case ("Char"):
                    case ("SByte"):
                    case ("UInt16"):
                    case ("UInt32"):
                    case ("UInt64"):
                        throw new SystemException("Invalid data type");


                    case ("System.String"):
                        parm.DbType = DbType.String;
                        parm.ParameterName = paramNames[j];
                        parm.Value = (string)paramList[j];
                        coll.Add(parm);
                        break;

                    case ("System.Byte[]"):
                        parm.DbType = DbType.Binary;
                        parm.ParameterName = paramNames[j];
                        parm.Value = (byte[])paramList[j];
                        coll.Add(parm);
                        break;

                    case ("System.Int32"):
                        parm.DbType = DbType.Int32;
                        parm.ParameterName = paramNames[j];
                        parm.Value = (int)paramList[j];
                        coll.Add(parm);
                        break;

                    case ("System.Int64"):
                        parm.DbType = DbType.Int32;
                        parm.ParameterName = paramNames[j];
                        parm.Value = Convert.ToInt32(paramList[j]);
                        coll.Add(parm);
                        break;

                    case ("System.Boolean"):
                        parm.DbType = DbType.Boolean;
                        parm.ParameterName = paramNames[j];
                        parm.Value = (bool)paramList[j];
                        coll.Add(parm);
                        break;

                    case ("System.DateTime"):
                        parm.DbType = DbType.DateTime;
                        parm.ParameterName = paramNames[j];
                        parm.Value = Convert.ToDateTime(paramList[j]);
                        coll.Add(parm);
                        break;

                    case ("System.Double"):
                        parm.DbType = DbType.Double;
                        parm.ParameterName = paramNames[j];
                        parm.Value = Convert.ToDouble(paramList[j]);
                        coll.Add(parm);
                        break;

                    case ("System.Single"):
                    case ("System.Decimal"):
                        parm.DbType = DbType.Decimal;
                        parm.ParameterName = paramNames[j];
                        parm.Value = Convert.ToDecimal(paramList[j]);
                        coll.Add(parm);
                        break;

                    case ("System.Guid"):
                        parm.DbType = DbType.Guid;
                        parm.ParameterName = paramNames[j];
                        parm.Value = (System.Guid)(paramList[j]);
                        coll.Add(parm);
                        break;

                    case ("System.Object"):

                        parm.DbType = DbType.Object;
                        parm.ParameterName = paramNames[j];
                        parm.Value = paramList[j];
                        coll.Add(parm);
                        break;

                    default:
                        throw new SystemException("Value is of unknown data type");

                } // end switch

                j++;
            }
            return coll;
        }
        #endregion
        
     
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
DataTable的Excel数据存入MySQL数据库可以按照以下步骤进行: 1. 首先需要使用ExcelDataReader库来读取Excel文件数据,该库支持读取多种格式的Excel文件,包括xls和xlsx格式。 2. 然后要使用MySQL Connector/NET库来连接到MySQL数据库。 3. 接下来,需要将读取到的Excel数据转换为MySQL数据对应的数据类型,并插入到MySQL数据。 以下是一个简单的示例代码: ```csharp // 读取Excel文件 using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read)) { using (var reader = ExcelReaderFactory.CreateReader(stream)) { // 获取第一个工作表 reader.Read(); var dataTable = reader.AsDataSet().Tables[0]; // 连接到MySQL数据库 var connectionString = "server=localhost;user id=root;password=123456;database=test"; using (var connection = new MySqlConnection(connectionString)) { connection.Open(); var command = connection.CreateCommand(); // 生成插入SQL语句 var sql = new StringBuilder(); sql.Append("INSERT INTO table_name (column1, column2, column3) VALUES "); for (int i = 1; i < dataTable.Rows.Count; i++) { sql.AppendFormat("('{0}', '{1}', '{2}'), ", dataTable.Rows[i][0], dataTable.Rows[i][1], dataTable.Rows[i][2]); } sql.Remove(sql.Length - 2, 2); // 移除最后一个逗号和空格 command.CommandText = sql.ToString(); // 执行SQL语句 command.ExecuteNonQuery(); } } } ``` 其,`table_name`表示要插入数据的MySQL数据库表名称,`column1`、`column2`、`column3`表示Excel表对应的列名。根据实际情况修改即可。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值