加入收藏 | 设为首页 | 会员中心 | 我要投稿 焦作站长网 (https://www.0391zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 产品 > 正文

SQL Server 批量插入数据的完美解决方案

发布时间:2020-12-17 15:33:36 所属栏目:产品 来源:互联网
导读:这篇文章主要介绍了SQL Server 批量插入数据的完美解决方案,需要的朋友可以参考下

/// <summary>
  /// 迭代器数据读取器
  /// </summary>
  /// <typeparam>模型类型</typeparam>
  public class EnumerableReader<TModel> : IDataReader
  {
    /// <summary>
    /// 实例化迭代器读取对象
    /// </summary>
    /// <param>模型源</param>
    public EnumerableReader(IEnumerable<TModel> source)
    {
      _source = source ?? throw new ArgumentNullException(nameof(source));
      _enumerable = source.GetEnumerator();
    }

private readonly IEnumerable<TModel> _source;
    private readonly IEnumerator<TModel> _enumerable;
    private object[] _currentDataRow = Array.Empty<object>();
    private int _depth;
    private bool _release;

public void Dispose()
    {
      _release = true;
      _enumerable.Dispose();
    }

public int GetValues(object[] values)
    {
      if (values == null) throw new ArgumentNullException(nameof(values));
      var length = Math.Min(_currentDataRow.Length, values.Length);
      Array.Copy(_currentDataRow, values, length);
      return length;
    }

public int GetOrdinal(string name)
    {
      for (int i = 0; i < ModelToDataTable<TModel>.Columns.Count; i++)
      {
        if (ModelToDataTable<TModel>.Columns[i].ColumnName == name) return i;
      }

return -1;
    }

public long GetBytes(int ordinal, long dataIndex, byte[] buffer, int bufferIndex, int length)
    {
      if (dataIndex < 0) throw new Exception($"起始下标不能小于0!");
      if (bufferIndex < 0) throw new Exception("目标缓冲区起始下标不能小于0!");
      if (length < 0) throw new Exception("读取长度不能小于0!");
      var numArray = (byte[])GetValue(ordinal);
      if (buffer == null) return numArray.Length;
      if (buffer.Length <= bufferIndex) throw new Exception("目标缓冲区起始下标不能大于目标缓冲区范围!");
      var freeLength = Math.Min(numArray.Length - bufferIndex, length);
      if (freeLength <= 0) return 0;
      Array.Copy(numArray, dataIndex, buffer, bufferIndex, length);
      return freeLength;
    }

public long GetChars(int ordinal, long dataIndex, char[] buffer, int bufferIndex, int length)
    {
      if (dataIndex < 0) throw new Exception($"起始下标不能小于0!");
      if (bufferIndex < 0) throw new Exception("目标缓冲区起始下标不能小于0!");
      if (length < 0) throw new Exception("读取长度不能小于0!");
      var numArray = (char[])GetValue(ordinal);
      if (buffer == null) return numArray.Length;
      if (buffer.Length <= bufferIndex) throw new Exception("目标缓冲区起始下标不能大于目标缓冲区范围!");
      var freeLength = Math.Min(numArray.Length - bufferIndex, length);
      if (freeLength <= 0) return 0;
      Array.Copy(numArray, dataIndex, buffer, bufferIndex, length);
      return freeLength;
    }

public bool IsDBNull(int i)
    {
      var value = GetValue(i);
      return value == null || value is DBNull;
    }
    public bool NextResult()
    {
      //移动到下一个元素
      if (!_enumerable.MoveNext()) return false;
      //行层+1
      Interlocked.Increment(ref _depth);
      //得到数据行
      _currentDataRow = ModelToDataTable<TModel>.ToRowData.Invoke(_enumerable.Current);
      return true;
    }

(编辑:焦作站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读