Oracle数据导入导出小工具(主要用于导入导出小批量含大字段的数据) ...

打印 上一主题 下一主题

主题 1494|帖子 1494|积分 4482

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
分析
项目
代码
下载


分析

各种缘故原由要导入导出几张表的数据,表中有几个大字段,各种不方便……,就写了这个小工具
项目

.net framework 4.8+Oracle.ManagedDataAccess

代码

using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Text.Json;
using System.Threading;
using System.Windows.Forms;
namespace OracleLargeObjectHelper
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        string connectionString = "";
        OracleLargeObjectHandler oracleLargeObjectHandler = null;
        /// <summary>
        /// 导出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExportTable_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtExportTableName.Text))
            {
                MessageBox.Show("请输入导出表名!");
                txtExportTableName.Focus();
                return;
            }
            try
            {
                btnExportTable.Enabled = false;
                if (oracleLargeObjectHandler == null)
                {
                    MessageBox.Show("请先测试连接!");
                    return;
                }
                int rowCount = 0;
                Stopwatch sw = new Stopwatch();
                sw.Start();
                oracleLargeObjectHandler.ExportTable(txtExportTableName.Text, txtExportTableName.Text + ".json", out rowCount);
                sw.Stop();
                MessageBox.Show($"导出成功,共计[{rowCount}]条记录,耗时[{sw.ElapsedMilliseconds / 1000.0}秒]");
            }
            catch (Exception ex)
            {
                MessageBox.Show("导出失败:" + ex.Message);
            }
            finally
            {
                btnExportTable.Enabled = true;
            }
        }
        /// <summary>
        /// 导入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnImportTable_Click(object sender, EventArgs e)
        {
            //txtImportTableName
            if (String.IsNullOrEmpty(txtImportTableName.Text))
            {
                MessageBox.Show("请输入导入表名!");
                txtExportTableName.Focus();
                return;
            }
            //txtinputFile
            if (String.IsNullOrEmpty(txtinputFile.Text))
            {
                MessageBox.Show("请选择数据文件!");
                txtinputFile.Focus();
                return;
            }
            try
            {
                btnImportTable.Enabled = false;
                if (oracleLargeObjectHandler == null)
                {
                    MessageBox.Show("请先测试连接!");
                    return;
                }
                int rowCount = 0;
                Stopwatch sw = new Stopwatch();
                sw.Start();
                oracleLargeObjectHandler.ImportTable(txtinputFile.Text, txtImportTableName.Text, out rowCount);
                MessageBox.Show($"导入成功,共计[{rowCount}]条记录,耗时[{sw.ElapsedMilliseconds/1000.0}秒]");
            }
            catch (Exception ex)
            {
                MessageBox.Show("导入失败:" + ex.Message);
            }
            finally
            {
                btnImportTable.Enabled = true;
            }
        }
        private void frmMain_Load(object sender, EventArgs e)
        {
        }
        /// <summary>
        /// 测试链接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnTestConn_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtConnStr.Text))
            {
                MessageBox.Show("请输入连接字符串!");
                txtConnStr.Focus();
                return;
            }
            connectionString = txtConnStr.Text;
            try
            {
                btnTestConn.Enabled = false;
                var conn = new OracleConnection(connectionString);
                conn.Open();
                MessageBox.Show("连接成功!");
                oracleLargeObjectHandler = new OracleLargeObjectHandler(connectionString);
            }
            catch (Exception ex)
            {
                MessageBox.Show("连接失败:" + ex.Message);
            }
            finally
            {
                btnTestConn.Enabled = true;
            }
        }
        /// <summary>
        /// 选择导入文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSelectImportFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = $"选择导入文件";
            ofd.Filter = "json文件| *.json;";
            ofd.ValidateNames = true;     //文件有用性验证ValidateNames,验证用户输入是否是一个有用的Windows文件名
            ofd.CheckFileExists = true;  //验证路径有用性
            ofd.CheckPathExists = true; //验证文件有用性
            ofd.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                string file = ofd.FileName;//文件的完备路径
                txtinputFile.Text = file;
                //文件路径
                var path = System.IO.Path.GetFullPath(file);
                //文件名
                string name = System.IO.Path.GetFileNameWithoutExtension(path);
                txtImportTableName.Text = name;
            }
        }
    }
    public class OracleLargeObjectHandler
    {
        private readonly string _connectionString;
        public OracleLargeObjectHandler(string connectionString)
        {
            _connectionString = connectionString;
        }
        public void ExportTable(string tableName, string outputFilePath, out int rowCount)
        {
            var conn = new OracleConnection(_connectionString);
            conn.Open();
            rowCount = 0;
            // 获取表结构信息
            var columns = GetTableColumns(conn, tableName);
            var cmd = conn.CreateCommand();
            cmd.CommandText = $"SELECT * FROM {tableName}";
            var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); // 紧张:次序访问大字段
            var fs = new FileStream(outputFilePath, FileMode.Create);
            var writer = new Utf8JsonWriter(fs);
            writer.WriteStartArray();
            while (reader.Read())
            {
                rowCount++;
                writer.WriteStartObject();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    var column = columns;
                    writer.WritePropertyName(column.Name);
                    if (reader.IsDBNull(i))
                    {
                        writer.WriteNullValue();
                    }
                    else
                    {
                        switch (column.DataType)
                        {
                            case "BLOB":
                                var buffer = reader.GetOracleBlob(i).Value;
                                writer.WriteBase64StringValue(buffer);
                                break;
                            case "CLOB":
                                writer.WriteStringValue(reader.GetOracleClob(i).Value);
                                break;
                            case "DATE":
                                writer.WriteStringValue(reader.GetDateTime(i).ToString("yyyy-MM-dd HH:mm:ss"));
                                break;
                            case "TIMESTAMP":
                                writer.WriteStringValue(reader.GetDateTime(i).ToString("yyyy-MM-dd HH:mm:ss.fff"));
                                break;
                            case "NUMBER":
                                var value = reader.GetOracleDecimal(i);
                                writer.WriteNumberValue(value.ToDouble());
                                break;
                            default:
                                writer.WriteStringValue(reader.ToString());
                                break;
                        }
                    }
                }
                writer.WriteEndObject();
            }
            writer.WriteEndArray();
            // 显式刷新缓冲区
            writer.Flush();
            writer.Dispose();
            fs.Dispose();
            reader.Dispose();
            cmd.Dispose();
            conn.Dispose();
        }
        public void ImportTable(string inputFilePath, string tableName, out int rowCount, int batchSize = 1000)
        {
            if (!File.Exists(inputFilePath))
            {
                throw new FileNotFoundException($"导出文件 {inputFilePath} 不存在");
            }
            var fileInfo = new FileInfo(inputFilePath);
            if (fileInfo.Length == 0)
            {
                throw new InvalidDataException("导出文件为空,请检查导出操纵是否成功");
            }
            // 添加JSON格式预验证
            try
            {
                var jsonDoc = JsonDocument.Parse(File.ReadAllBytes(inputFilePath));
                jsonDoc.Dispose();
            }
            catch (JsonException ex)
            {
                throw new InvalidDataException("JSON文件格式错误", ex);
            }
            var conn = new OracleConnection(_connectionString);
            conn.Open();
            var columns = GetTableColumns(conn, tableName);
            var insertColumns = string.Join(", ", columns.ConvertAll(c => c.Name));
            var parameters = string.Join(", ", columns.ConvertAll(c => $":{c.Name}"));
            var transaction = conn.BeginTransaction();
            var cmd = conn.CreateCommand();
            cmd.CommandText = $"INSERT INTO {tableName} ({insertColumns}) VALUES ({parameters})";
            cmd.BindByName = true;
            var records = JsonSerializer.Deserialize<List<Dictionary<string, JsonElement>>>(File.ReadAllBytes(inputFilePath));
            rowCount = 0;
            foreach (var record in records)
            {
                cmd.Parameters.Clear();
                foreach (var column in columns)
                {
                    var jsonElement = record[column.Name];
                    if (jsonElement.ValueKind == JsonValueKind.Null)
                    {
                        cmd.Parameters.Add(new OracleParameter(column.Name, DBNull.Value));
                        continue;
                    }
                    switch (column.DataType)
                    {
                        case "BLOB":
                            var blobParam = new OracleParameter(column.Name, OracleDbType.Blob);
                            blobParam.Value = jsonElement.GetBytesFromBase64();
                            cmd.Parameters.Add(blobParam);
                            break;
                        case "CLOB":
                            var clobValue = jsonElement.GetString();
                            var clobParam = new OracleParameter(column.Name, OracleDbType.Clob)
                            {
                                Value = clobValue
                            };
                            cmd.Parameters.Add(clobParam);
                            break;
                        case "DATE":
                            var dateValue = DateTime.ParseExact(
                                jsonElement.GetString(),
                                "yyyy-MM-dd HH:mm:ss", // 与导特别式保持一致
                                CultureInfo.InvariantCulture
                            );
                            var dateParam = new OracleParameter(column.Name, OracleDbType.Date)
                            {
                                Value = dateValue
                            };
                            cmd.Parameters.Add(dateParam);
                            break;
                        case "TIMESTAMP":
                            var timestampValue = DateTime.ParseExact(
                                jsonElement.GetString(),
                                "yyyy-MM-dd HH:mm:ss.fff",// 与导特别式保持一致
                                CultureInfo.InvariantCulture
                            );
                            var timestampParam = new OracleParameter(column.Name, OracleDbType.TimeStamp)
                            {
                                Value = timestampValue
                            };
                            cmd.Parameters.Add(timestampParam);
                            break;
                        case "NUMBER":
                            cmd.Parameters.Add(new OracleParameter(column.Name,
                                OracleDbType.Decimal,
                                jsonElement.GetDecimal(),
                                ParameterDirection.Input));
                            break;
                        case "VARCHAR2":
                        case "CHAR":
                            var strValue = jsonElement.GetString();
                            if (strValue.Length > column.Length)
                            {
                                throw new InvalidOperationException(
                                    $"字段 {column.Name} 值长度超过限制({column.Length})");
                            }
                            cmd.Parameters.Add(new OracleParameter(column.Name, strValue));
                            break;
                        default:
                            cmd.Parameters.Add(new OracleParameter(column.Name, jsonElement.GetString()));
                            break;
                    }
                }
                cmd.ExecuteNonQuery();
                if (++rowCount % batchSize == 0)
                {
                    transaction.Commit();
                    transaction.Dispose();
                    transaction = conn.BeginTransaction();
                }
            }
            transaction.Commit();
            transaction.Dispose();
            cmd.Dispose();
            conn.Close();
        }
        private List<TableColumn> GetTableColumns(OracleConnection conn, string tableName)
        {
            var columns = new List<TableColumn>();
            var cmd = conn.CreateCommand();
            cmd.CommandText = @"
            SELECT 
                column_name, 
                data_type,
                data_precision,
                data_scale,
                data_length
            FROM all_tab_cols 
            WHERE table_name = :tableName 
            ORDER BY column_id";
            cmd.Parameters.Add(new OracleParameter("tableName", tableName.ToUpper()));
            var reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                columns.Add(new TableColumn(
                    reader.GetString(0),
                    reader.GetString(1),
                    reader.IsDBNull(2) ? (int?)null : reader.GetInt32(2),
                    reader.IsDBNull(3) ? (int?)null : reader.GetInt32(3),
                    reader.GetInt32(4)
                ));
            }
            reader.Dispose();
            cmd.Dispose();
            return columns;
        }
        private class TableColumn
        {
            public string Name { get; }
            public string DataType { get; }
            public int? Precision { get; }
            public int? Scale { get; }
            public int Length { get; }
            public TableColumn(string name, string dataType, int? precision, int? scale, int length)
            {
                Name = name;
                DataType = dataType.ToUpper();
                Precision = precision;
                Scale = scale;
                Length = length;
            }
        }
    }
}
 
  1. using Oracle.ManagedDataAccess.Client;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Globalization;
  7. using System.IO;
  8. using System.Text.Json;
  9. using System.Threading;
  10. using System.Windows.Forms;
  11. namespace OracleLargeObjectHelper
  12. {
  13.     public partial class frmMain : Form
  14.     {
  15.         public frmMain()
  16.         {
  17.             InitializeComponent();
  18.         }
  19.         string connectionString = "";
  20.         OracleLargeObjectHandler oracleLargeObjectHandler = null;
  21.         /// <summary>
  22.         /// 导出
  23.         /// </summary>
  24.         /// <param name="sender"></param>
  25.         /// <param name="e"></param>
  26.         private void btnExportTable_Click(object sender, EventArgs e)
  27.         {
  28.             if (String.IsNullOrEmpty(txtExportTableName.Text))
  29.             {
  30.                 MessageBox.Show("请输入导出表名!");
  31.                 txtExportTableName.Focus();
  32.                 return;
  33.             }
  34.             try
  35.             {
  36.                 btnExportTable.Enabled = false;
  37.                 if (oracleLargeObjectHandler == null)
  38.                 {
  39.                     MessageBox.Show("请先测试连接!");
  40.                     return;
  41.                 }
  42.                 int rowCount = 0;
  43.                 Stopwatch sw = new Stopwatch();
  44.                 sw.Start();
  45.                 oracleLargeObjectHandler.ExportTable(txtExportTableName.Text, txtExportTableName.Text + ".json", out rowCount);
  46.                 sw.Stop();
  47.                 MessageBox.Show($"导出成功,共计[{rowCount}]条记录,耗时[{sw.ElapsedMilliseconds / 1000.0}秒]");
  48.             }
  49.             catch (Exception ex)
  50.             {
  51.                 MessageBox.Show("导出失败:" + ex.Message);
  52.             }
  53.             finally
  54.             {
  55.                 btnExportTable.Enabled = true;
  56.             }
  57.         }
  58.         /// <summary>
  59.         /// 导入
  60.         /// </summary>
  61.         /// <param name="sender"></param>
  62.         /// <param name="e"></param>
  63.         private void btnImportTable_Click(object sender, EventArgs e)
  64.         {
  65.             //txtImportTableName
  66.             if (String.IsNullOrEmpty(txtImportTableName.Text))
  67.             {
  68.                 MessageBox.Show("请输入导入表名!");
  69.                 txtExportTableName.Focus();
  70.                 return;
  71.             }
  72.             //txtinputFile
  73.             if (String.IsNullOrEmpty(txtinputFile.Text))
  74.             {
  75.                 MessageBox.Show("请选择数据文件!");
  76.                 txtinputFile.Focus();
  77.                 return;
  78.             }
  79.             try
  80.             {
  81.                 btnImportTable.Enabled = false;
  82.                 if (oracleLargeObjectHandler == null)
  83.                 {
  84.                     MessageBox.Show("请先测试连接!");
  85.                     return;
  86.                 }
  87.                 int rowCount = 0;
  88.                 Stopwatch sw = new Stopwatch();
  89.                 sw.Start();
  90.                 oracleLargeObjectHandler.ImportTable(txtinputFile.Text, txtImportTableName.Text, out rowCount);
  91.                 MessageBox.Show($"导入成功,共计[{rowCount}]条记录,耗时[{sw.ElapsedMilliseconds/1000.0}秒]");
  92.             }
  93.             catch (Exception ex)
  94.             {
  95.                 MessageBox.Show("导入失败:" + ex.Message);
  96.             }
  97.             finally
  98.             {
  99.                 btnImportTable.Enabled = true;
  100.             }
  101.         }
  102.         private void frmMain_Load(object sender, EventArgs e)
  103.         {
  104.         }
  105.         /// <summary>
  106.         /// 测试链接
  107.         /// </summary>
  108.         /// <param name="sender"></param>
  109.         /// <param name="e"></param>
  110.         private void btnTestConn_Click(object sender, EventArgs e)
  111.         {
  112.             if (String.IsNullOrEmpty(txtConnStr.Text))
  113.             {
  114.                 MessageBox.Show("请输入连接字符串!");
  115.                 txtConnStr.Focus();
  116.                 return;
  117.             }
  118.             connectionString = txtConnStr.Text;
  119.             try
  120.             {
  121.                 btnTestConn.Enabled = false;
  122.                 var conn = new OracleConnection(connectionString);
  123.                 conn.Open();
  124.                 MessageBox.Show("连接成功!");
  125.                 oracleLargeObjectHandler = new OracleLargeObjectHandler(connectionString);
  126.             }
  127.             catch (Exception ex)
  128.             {
  129.                 MessageBox.Show("连接失败:" + ex.Message);
  130.             }
  131.             finally
  132.             {
  133.                 btnTestConn.Enabled = true;
  134.             }
  135.         }
  136.         /// <summary>
  137.         /// 选择导入文件
  138.         /// </summary>
  139.         /// <param name="sender"></param>
  140.         /// <param name="e"></param>
  141.         private void btnSelectImportFile_Click(object sender, EventArgs e)
  142.         {
  143.             OpenFileDialog ofd = new OpenFileDialog();
  144.             ofd.Title = $"选择导入文件";
  145.             ofd.Filter = "json文件| *.json;";
  146.             ofd.ValidateNames = true;     //文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名
  147.             ofd.CheckFileExists = true;  //验证路径有效性
  148.             ofd.CheckPathExists = true; //验证文件有效性
  149.             ofd.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
  150.             if (ofd.ShowDialog() == DialogResult.OK)
  151.             {
  152.                 string file = ofd.FileName;//文件的完整路径
  153.                 txtinputFile.Text = file;
  154.                 //文件路径
  155.                 var path = System.IO.Path.GetFullPath(file);
  156.                 //文件名
  157.                 string name = System.IO.Path.GetFileNameWithoutExtension(path);
  158.                 txtImportTableName.Text = name;
  159.             }
  160.         }
  161.     }
  162.     public class OracleLargeObjectHandler
  163.     {
  164.         private readonly string _connectionString;
  165.         public OracleLargeObjectHandler(string connectionString)
  166.         {
  167.             _connectionString = connectionString;
  168.         }
  169.         public void ExportTable(string tableName, string outputFilePath, out int rowCount)
  170.         {
  171.             var conn = new OracleConnection(_connectionString);
  172.             conn.Open();
  173.             rowCount = 0;
  174.             // 获取表结构信息
  175.             var columns = GetTableColumns(conn, tableName);
  176.             var cmd = conn.CreateCommand();
  177.             cmd.CommandText = $"SELECT * FROM {tableName}";
  178.             var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); // 重要:顺序访问大字段
  179.             var fs = new FileStream(outputFilePath, FileMode.Create);
  180.             var writer = new Utf8JsonWriter(fs);
  181.             writer.WriteStartArray();
  182.             while (reader.Read())
  183.             {
  184.                 rowCount++;
  185.                 writer.WriteStartObject();
  186.                 for (int i = 0; i < reader.FieldCount; i++)
  187.                 {
  188.                     var column = columns[i];
  189.                     writer.WritePropertyName(column.Name);
  190.                     if (reader.IsDBNull(i))
  191.                     {
  192.                         writer.WriteNullValue();
  193.                     }
  194.                     else
  195.                     {
  196.                         switch (column.DataType)
  197.                         {
  198.                             case "BLOB":
  199.                                 var buffer = reader.GetOracleBlob(i).Value;
  200.                                 writer.WriteBase64StringValue(buffer);
  201.                                 break;
  202.                             case "CLOB":
  203.                                 writer.WriteStringValue(reader.GetOracleClob(i).Value);
  204.                                 break;
  205.                             case "DATE":
  206.                                 writer.WriteStringValue(reader.GetDateTime(i).ToString("yyyy-MM-dd HH:mm:ss"));
  207.                                 break;
  208.                             case "TIMESTAMP":
  209.                                 writer.WriteStringValue(reader.GetDateTime(i).ToString("yyyy-MM-dd HH:mm:ss.fff"));
  210.                                 break;
  211.                             case "NUMBER":
  212.                                 var value = reader.GetOracleDecimal(i);
  213.                                 writer.WriteNumberValue(value.ToDouble());
  214.                                 break;
  215.                             default:
  216.                                 writer.WriteStringValue(reader[i].ToString());
  217.                                 break;
  218.                         }
  219.                     }
  220.                 }
  221.                 writer.WriteEndObject();
  222.             }
  223.             writer.WriteEndArray();
  224.             // 显式刷新缓冲区
  225.             writer.Flush();
  226.             writer.Dispose();
  227.             fs.Dispose();
  228.             reader.Dispose();
  229.             cmd.Dispose();
  230.             conn.Dispose();
  231.         }
  232.         public void ImportTable(string inputFilePath, string tableName, out int rowCount, int batchSize = 1000)
  233.         {
  234.             if (!File.Exists(inputFilePath))
  235.             {
  236.                 throw new FileNotFoundException($"导出文件 {inputFilePath} 不存在");
  237.             }
  238.             var fileInfo = new FileInfo(inputFilePath);
  239.             if (fileInfo.Length == 0)
  240.             {
  241.                 throw new InvalidDataException("导出文件为空,请检查导出操作是否成功");
  242.             }
  243.             // 添加JSON格式预验证
  244.             try
  245.             {
  246.                 var jsonDoc = JsonDocument.Parse(File.ReadAllBytes(inputFilePath));
  247.                 jsonDoc.Dispose();
  248.             }
  249.             catch (JsonException ex)
  250.             {
  251.                 throw new InvalidDataException("JSON文件格式错误", ex);
  252.             }
  253.             var conn = new OracleConnection(_connectionString);
  254.             conn.Open();
  255.             var columns = GetTableColumns(conn, tableName);
  256.             var insertColumns = string.Join(", ", columns.ConvertAll(c => c.Name));
  257.             var parameters = string.Join(", ", columns.ConvertAll(c => $":{c.Name}"));
  258.             var transaction = conn.BeginTransaction();
  259.             var cmd = conn.CreateCommand();
  260.             cmd.CommandText = $"INSERT INTO {tableName} ({insertColumns}) VALUES ({parameters})";
  261.             cmd.BindByName = true;
  262.             var records = JsonSerializer.Deserialize<List<Dictionary<string, JsonElement>>>(File.ReadAllBytes(inputFilePath));
  263.             rowCount = 0;
  264.             foreach (var record in records)
  265.             {
  266.                 cmd.Parameters.Clear();
  267.                 foreach (var column in columns)
  268.                 {
  269.                     var jsonElement = record[column.Name];
  270.                     if (jsonElement.ValueKind == JsonValueKind.Null)
  271.                     {
  272.                         cmd.Parameters.Add(new OracleParameter(column.Name, DBNull.Value));
  273.                         continue;
  274.                     }
  275.                     switch (column.DataType)
  276.                     {
  277.                         case "BLOB":
  278.                             var blobParam = new OracleParameter(column.Name, OracleDbType.Blob);
  279.                             blobParam.Value = jsonElement.GetBytesFromBase64();
  280.                             cmd.Parameters.Add(blobParam);
  281.                             break;
  282.                         case "CLOB":
  283.                             var clobValue = jsonElement.GetString();
  284.                             var clobParam = new OracleParameter(column.Name, OracleDbType.Clob)
  285.                             {
  286.                                 Value = clobValue
  287.                             };
  288.                             cmd.Parameters.Add(clobParam);
  289.                             break;
  290.                         case "DATE":
  291.                             var dateValue = DateTime.ParseExact(
  292.                                 jsonElement.GetString(),
  293.                                 "yyyy-MM-dd HH:mm:ss", // 与导出格式保持一致
  294.                                 CultureInfo.InvariantCulture
  295.                             );
  296.                             var dateParam = new OracleParameter(column.Name, OracleDbType.Date)
  297.                             {
  298.                                 Value = dateValue
  299.                             };
  300.                             cmd.Parameters.Add(dateParam);
  301.                             break;
  302.                         case "TIMESTAMP":
  303.                             var timestampValue = DateTime.ParseExact(
  304.                                 jsonElement.GetString(),
  305.                                 "yyyy-MM-dd HH:mm:ss.fff",// 与导出格式保持一致
  306.                                 CultureInfo.InvariantCulture
  307.                             );
  308.                             var timestampParam = new OracleParameter(column.Name, OracleDbType.TimeStamp)
  309.                             {
  310.                                 Value = timestampValue
  311.                             };
  312.                             cmd.Parameters.Add(timestampParam);
  313.                             break;
  314.                         case "NUMBER":
  315.                             cmd.Parameters.Add(new OracleParameter(column.Name,
  316.                                 OracleDbType.Decimal,
  317.                                 jsonElement.GetDecimal(),
  318.                                 ParameterDirection.Input));
  319.                             break;
  320.                         case "VARCHAR2":
  321.                         case "CHAR":
  322.                             var strValue = jsonElement.GetString();
  323.                             if (strValue.Length > column.Length)
  324.                             {
  325.                                 throw new InvalidOperationException(
  326.                                     $"字段 {column.Name} 值长度超过限制({column.Length})");
  327.                             }
  328.                             cmd.Parameters.Add(new OracleParameter(column.Name, strValue));
  329.                             break;
  330.                         default:
  331.                             cmd.Parameters.Add(new OracleParameter(column.Name, jsonElement.GetString()));
  332.                             break;
  333.                     }
  334.                 }
  335.                 cmd.ExecuteNonQuery();
  336.                 if (++rowCount % batchSize == 0)
  337.                 {
  338.                     transaction.Commit();
  339.                     transaction.Dispose();
  340.                     transaction = conn.BeginTransaction();
  341.                 }
  342.             }
  343.             transaction.Commit();
  344.             transaction.Dispose();
  345.             cmd.Dispose();
  346.             conn.Close();
  347.         }
  348.         private List<TableColumn> GetTableColumns(OracleConnection conn, string tableName)
  349.         {
  350.             var columns = new List<TableColumn>();
  351.             var cmd = conn.CreateCommand();
  352.             cmd.CommandText = @"
  353.             SELECT
  354.                 column_name,
  355.                 data_type,
  356.                 data_precision,
  357.                 data_scale,
  358.                 data_length
  359.             FROM all_tab_cols
  360.             WHERE table_name = :tableName
  361.             ORDER BY column_id";
  362.             cmd.Parameters.Add(new OracleParameter("tableName", tableName.ToUpper()));
  363.             var reader = cmd.ExecuteReader();
  364.             while (reader.Read())
  365.             {
  366.                 columns.Add(new TableColumn(
  367.                     reader.GetString(0),
  368.                     reader.GetString(1),
  369.                     reader.IsDBNull(2) ? (int?)null : reader.GetInt32(2),
  370.                     reader.IsDBNull(3) ? (int?)null : reader.GetInt32(3),
  371.                     reader.GetInt32(4)
  372.                 ));
  373.             }
  374.             reader.Dispose();
  375.             cmd.Dispose();
  376.             return columns;
  377.         }
  378.         private class TableColumn
  379.         {
  380.             public string Name { get; }
  381.             public string DataType { get; }
  382.             public int? Precision { get; }
  383.             public int? Scale { get; }
  384.             public int Length { get; }
  385.             public TableColumn(string name, string dataType, int? precision, int? scale, int length)
  386.             {
  387.                 Name = name;
  388.                 DataType = dataType.ToUpper();
  389.                 Precision = precision;
  390.                 Scale = scale;
  391.                 Length = length;
  392.             }
  393.         }
  394.     }
  395. }
复制代码
下载

源码下载

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表