Example #1
0
        public void SendMutilDb()
        {
            var dbProvider = DbConnectionProvider.CreateDbProvider(MyDataConfigger.DbKey);
            var data       = new DataTable();

            data.Columns.Add("id", typeof(long));
            data.Columns.Add("name", typeof(string));
            data.Columns.Add("sex", typeof(bool));
            data.Columns.Add("money", typeof(decimal));
            data.Columns.Add("create_time", typeof(DateTime));
            for (int i = 0; i < 10; i++)
            {
                var dr = data.NewRow();
                dr["id"]          = i + 1;
                dr["name"]        = "晨test_" + i;
                dr["sex"]         = 1;
                dr["money"]       = 45.23;
                dr["create_time"] = DateTime.Now;
                data.Rows.Add(dr);
            }
            DbBulkOption option = new DbBulkOption()
            {
            };
            var watch  = Stopwatch.StartNew();
            var result = dbProvider.ExecuteBulkQuery("bulk_temp", data, option);

            Trace.WriteLine("result:" + result);
            WaitEnd(watch);
        }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="tabkeName"></param>
        /// <param name="dataTable"></param>
        /// <param name="option"></param>
        /// <returns></returns>
        public override long ExecuteBulkQuery(string tabkeName, DataTable dataTable, DbBulkOption option)
        {
            long result = 0;

            OpenConnection(conn =>
            {
                var tran = conn.BeginTransaction();
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, option.CopyOptions, tran))
                {
                    SetBulkOption(bulkCopy, tabkeName, option);
                    foreach (DataColumn col in dataTable.Columns)
                    {
                        bulkCopy.ColumnMappings.Add(col.ColumnName, option.GetColumnMapping(col.ColumnName));
                    }

                    try
                    {
                        bulkCopy.WriteToServer(dataTable);
                        tran.Commit();
                        result = bulkCopy.NotifyAfter;
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw ex;
                    }
                }
            });
            return(result);
        }
Example #3
0
 private static void SetBulkOption(SqlBulkCopy bulkCopy, string tabkeName, DbBulkOption option)
 {
     bulkCopy.DestinationTableName = tabkeName;
     if (option.Timeout.HasValue)
     {
         bulkCopy.BulkCopyTimeout = option.Timeout.Value;
     }
     if (option.BashSize.HasValue)
     {
         bulkCopy.BatchSize = option.BashSize.Value;
     }
     bulkCopy.SqlRowsCopied += (object sender, SqlRowsCopiedEventArgs e) =>
     {
         option.OnRowsCopied(e.RowsCopied);
     };
 }
Example #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="tabkeName"></param>
        /// <param name="dataTable"></param>
        /// <param name="option"></param>
        /// <returns></returns>
        public override long ExecuteBulkQuery(string tabkeName, DataTable dataTable, DbBulkOption option)
        {
            long result = 0;

            OpenConnection(conn =>
            {
                MySqlBulkLoader bulkCopy = new MySqlBulkLoader(conn);
                SetBulkOption(bulkCopy, tabkeName, option);
                var columns = new List <string>();
                foreach (DataColumn col in dataTable.Columns)
                {
                    string column = option.GetColumnMapping(col.ColumnName);
                    columns.Add(column);
                    bulkCopy.Columns.Add(column);
                }
                BuildTempFile(columns, dataTable, option);
                FileInfo fi            = new FileInfo(option.TempPath);
                FileAttributes oldAttr = fi.Attributes;
                try
                {
                    fi.Attributes = fi.Attributes | FileAttributes.ReadOnly;
                    result        = bulkCopy.Load();
                }
                finally
                {
                    fi.Attributes = oldAttr;
                    try
                    {
                        fi.Delete();
                    }
                    catch
                    {
                    }
                }
            });
            return(result);
        }
Example #5
0
 private static void SetBulkOption(MySqlBulkLoader bulkCopy, string tabkeName, DbBulkOption option)
 {
     if (string.IsNullOrEmpty(tabkeName))
     {
         throw new ArgumentNullException(nameof(tabkeName));
     }
     if (string.IsNullOrEmpty(option.TempPath))
     {
         option.TempPath = Path.GetTempFileName();
     }
     bulkCopy.TableName = tabkeName;
     bulkCopy.FileName  = option.TempPath;
     if (option.Timeout.HasValue)
     {
         bulkCopy.Timeout = option.Timeout.Value;
     }
     if (!string.IsNullOrEmpty(option.LinePrefix))
     {
         bulkCopy.LinePrefix = option.LinePrefix;
     }
     if (!string.IsNullOrEmpty(option.FieldTerminator))
     {
         bulkCopy.FieldTerminator = option.FieldTerminator;
     }
     if (!string.IsNullOrEmpty(option.LineTerminator))
     {
         bulkCopy.LineTerminator = option.LineTerminator;
     }
     if (option.ConflictOption.HasValue)
     {
         bulkCopy.ConflictOption = option.ConflictOption.Value;
     }
     if (option.FieldQuotationCharacter.HasValue)
     {
         bulkCopy.FieldQuotationCharacter = option.FieldQuotationCharacter.Value;
         bulkCopy.FieldQuotationOptional  = true;
     }
     if (option.NumberOfLinesToSkip.HasValue)
     {
         bulkCopy.NumberOfLinesToSkip = option.NumberOfLinesToSkip.Value;
     }
     if (option.EscapeCharacter.HasValue)
     {
         bulkCopy.EscapeCharacter = option.EscapeCharacter.Value;
     }
 }
Example #6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="tabkeName"></param>
        /// <param name="columns"></param>
        /// <param name="dataReader"></param>
        /// <param name="option"></param>
        /// <returns></returns>
        public override long ExecuteBulkQuery(string tabkeName, IEnumerable <string> columns, IDataReader dataReader, DbBulkOption option)
        {
            long result = 0;

            OpenConnection(conn =>
            {
                MySqlBulkLoader bulkCopy = new MySqlBulkLoader(conn);
                SetBulkOption(bulkCopy, tabkeName, option);
                foreach (var column in columns)
                {
                    bulkCopy.Columns.Add(option.GetColumnMapping(column));
                }
                BuildTempFile(columns, dataReader, option);
                FileInfo fi            = new FileInfo(option.TempPath);
                FileAttributes oldAttr = fi.Attributes;
                try
                {
                    fi.Attributes = fi.Attributes | FileAttributes.ReadOnly;
                    result        = bulkCopy.Load();
                }
                finally
                {
                    fi.Attributes = oldAttr;
                    try
                    {
                        fi.Delete();
                    }
                    catch
                    {
                    }
                }
            });
            return(result);
        }
Example #7
0
 private void BuildTempFile(IEnumerable <string> columns, IDataReader dataReader, DbBulkOption option)
 {
     using (StreamWriter sw = new StreamWriter(File.OpenWrite(option.TempPath)))
     {
         while (dataReader.Read())
         {
             sw.Write($"{option.LinePrefix ?? ""}");
             int columnIndex = 0;
             foreach (var column in columns)
             {
                 columnIndex++;
                 var  index     = dataReader.GetOrdinal(column);
                 Type fieldType = dataReader.GetFieldType(index);
                 if (option.ColumnValueFormat != null)
                 {
                     option.ColumnValueFormat(sw, column, fieldType, dataReader[column]);
                     //处理结束符
                     if (columnIndex > 1)
                     {
                         sw.Write(option.FieldTerminator);
                     }
                     continue;
                 }
                 //默认值处理
                 if (typeof(DateTime) == fieldType)
                 {
                     sw.Write($"{dataReader.GetDateTime(index).ToString(option.DateTimeFormat)}");
                 }
                 else
                 {
                     sw.Write($"{dataReader.GetString(index)}");
                 }
                 //处理结束符
                 if (columnIndex > 1)
                 {
                     sw.Write(option.FieldTerminator);
                 }
             }
             sw.Write(option.LineTerminator);
         }
         sw.Flush();
     }
 }
Example #8
0
        private void BuildTempFile(IEnumerable <string> columns, DataTable dataTable, DbBulkOption option)
        {
            using (StreamWriter sw = new StreamWriter(File.OpenWrite(option.TempPath)))
            {
                foreach (DataRow row in dataTable.Rows)
                {
                    sw.Write($"{option.LinePrefix ?? ""}");
                    int columnIndex = 0;
                    foreach (var column in columns)
                    {
                        columnIndex++;
                        //处理结束符
                        if (columnIndex > 1)
                        {
                            sw.Write(option.FieldTerminator);
                        }

                        Type fieldType = row.Table.Columns[column].DataType;
                        if (option.ColumnValueFormat != null)
                        {
                            option.ColumnValueFormat(sw, column, fieldType, row[column]);
                            continue;
                        }
                        //默认值处理
                        if (typeof(DateTime) == fieldType)
                        {
                            sw.Write($"{row[column].ToDateTime().ToString(option.DateTimeFormat)}");
                        }
                        else
                        {
                            sw.Write($"{row[column].ToNotNullString()}");
                        }
                    }
                    sw.Write(option.LineTerminator);
                }
                sw.Flush();
            }
        }