c# – 使用继承的自定义IDataReader从IDbCommand读取

我已经使一个自定义类继承IDataReader并且已经成功
实现了一个使用C#对象而不是DataTable的自定义类的自定义ServerWriter sqlBulkcopy.

这被证明是一个更有效的方法,我怀疑.

现在我想读,我有一些问题

这是IDataReader:

// get Server Data Table Object IDataReader
public class GetSDTOIDataReaderM : IDataReader
{
   //private IEnumerator<MyTestObject> enumerator = null;

   public MysqLDbTableObject.Raw.sqlDbTableM propsqlTbl { get; set; }

   // implementing relevant GetValue(),filedCount() and Read()
   // this is how I did with WritetoServer
   public bool Read()
   {
       return ++this.ReaderRowsCount < this.propsqlTbl.Table.ElementAt(0).Row.Count;
   }
}

该对象与其相应的sqlTable精确映射.

在我的自定义IDataReader中设置一个sqlCommand到ExecuteReader()没有工作,所以我试过
IDbCommand然后它编译,但仍然在尝试阅读
我收到一个错误

Unable to cast object of type ‘System.Data.sqlClient.sqlDataReader’ to
type ‘GetSDTOIDataReaderM’

this.propComunicator.AsGetSDTOCom().sqlCmd.Connection.open();
//this is the line of the error
using (this.propComunicator.AsGetSDTOCom().SDTOIDataReader = (Raw.Comunicator.Raw.GetSDTOIDataReaderM)this.propComunicator.AsGetSDTOCom().sqlCmd.ExecuteReader())
{

}

写入服务器它的工作,我怎么能正确实现与读?

UPDATE

更多关于我的模块

public class TransManSF
{
    public enum CommunicatorTypeS { Reader,Adapter,GetSDTOReaderA,sqlBcpyIDataReaderM };
    public enum DbIntreactorTypeS { TableObject,TableRowObject,Sproc,sqlCmd };
    public enum sqlCmdactionS { NotSet,SELECT,INSERT,UPDATE,DROP };
    public enum sqlCmdstrSelModeS { Single,RecentEfected,count,All,Top10,Top100,Top1000 };
    public enum sqlCmdstrSelOrderByS { NotSet = 0,Asc = 1,Desc = 2 };
    public enum sqlCmdstrSetterModeS { Single,Multi};
    public enum STDOTypeS { NotSet,ServerWriter,ServerTableGetter,ServerBiDerctional }
    public enum SprocTypeS { Sproc,TvPSrpoc }
    public enum TransExecActionTypeS { WritetoServer,GetTable }
}

public static TransMan.Raw.ComunicatorCLF.BulkCopycomSCL AsBulkCopycom(this TransMan.Raw.ComunicatorCLF.ComunicatorM SelfCom)
{
    return (TransMan.Raw.ComunicatorCLF.BulkCopycomSCL)SelfCom;
}

virtual public void ExecuteTransaction(AppMods.DataBase.TransManSF.TransExecActionTypeS parSelectedTransType,TransManSF.sqlCmdstrSelOrderByS parExecOrderByS,int OrderByOrdinal = 0)
{
    if (parSelectedTransType == AppMods.DataBase.TransManSF.TransExecActionTypeS.WritetoServer)
        using (this.propComunicator.AsBulkCopycom().Conn)
        {
            this.propComunicator.AsBulkCopycom().Conn.open();
            using (var IDRdrServerWriter = this.propComunicator.AsBulkCopycom().ServerWriter)
            {
                var Eng = this.propExecuter.AsBulkcopyExec().Engine;
                Eng.BulkcopyTimeout = 240;
                Eng.WritetoServer(IDRdrServerWriter);

            }
            this.propComunicator.AsBulkCopycom().Conn.Close();
        }
    else if (parSelectedTransType == AppMods.DataBase.TransManSF.TransExecActionTypeS.GetTable)
    {
        var DreaderCom = this.propComunicator.AsDReaderCom();
        using (DreaderCom.sqlCmd.Connection)
        {
            DreaderCom.sqlCmd.Connection.open();
            using (DreaderCom.Driver = DreaderCom.sqlCmd.ExecuteReader())
            {
                if (DreaderCom.Driver.HasRows) while (DreaderCom.Driver.Read())
                    {
                        for (int i = 0; i < DreaderCom.Driver.FieldCount; i++)
                        {
                            var CurRdrColumn = DreaderCom.Driver.GetValue(i);
                            this.Table[i,0] = CurRdrColumn;
                        }
                    }
            }
            DreaderCom.sqlCmd.Connection.Close();
        }                           
    }
}


public struct customComConfgBulkcopyA
{
      public TransManSF.CommunicatorTypeS ComType;
      public customComConfgBulkcopyA(TransManSF.CommunicatorTypeS ctrComType = TransManSF.CommunicatorTypeS.sqlBcpyIDataReaderM)
      {
          this.ComType = ctrComType;
      }
}
public sealed class BulkCopycomSCL :CustomComA
{
     public new Configurations.comunicator.customComConfgBulkcopyA Meta;
     public sqlConnection Conn { get; set; }
     public Raw.sqlBcpyIDataReaderM ServerWriter { get; set; }
}

public class sqlDbTableM : sqlDB1stTransA
{
     virtual public DbSchema.Raw.TableDictionaryA TableDict { get; set; }
     public virtual new TransMan.Raw.Configurations.SDB1stTransConfgF.SDTOMetaA Meta { get; set; }
     virtual public Raw.ColumnSetsCollM Table { get; set; }
     public override TransMan.Raw.ComunicatorCLF.ComunicatorM propComunicator
     {
         get
         {
              return base.propComunicator;
         }
         set
         {
              base.propComunicator = value;
         }
     }
     public override TransMan.Raw.Executers.ExecuterM propExecuter
     {
         get
         {
             return base.propExecuter;
         }
         set
         {
             base.propExecuter = value;
         }
     }
     public sqlDbTableM(TransManSF.STDOTypeS ctrTransType)
            : base(TransManSF.DbIntreactorTypeS.TableObject) { }
}

public sealed class GetSDTOComSCL : CustomComA
{
    public new Configurations.comunicator.customComConfgGetSDTOReaderA Meta;
    public new IDbCommand sqlCmd;
    public Raw.GetSDTOIDataReaderM SDTOIDataReader { get; set; }
}

解决方法

简短的答案:您不能更改sqlCommand.ExecuteReader()返回的类型.

它将始终是sqlDataReader的一个实例.

各种解决方

1把你所了解的东西包裹起来.

如果你去极端,写自己的IDbProviderFactory,它包装一个sqlConnection与自己的连接,命令和datareader类.

例如,这就是Miniprofiler对所有sql请求进行测试,并收集执行时间,行数等

或者您可以使用某种扩展方法来包装读取器,如:sqlCmd.ExecuteReader().AsMyReader().什么AsMyReader()会做的是返回一个自定义IDataReader,它的东西和委托到实际的sqlDataReader.

2使用现有的助手库

我不太清楚你在阅读内容时想要实现什么,但是在这个空间中存在着很好的图书馆.没有必要提出自己的解决方案.

FastMember(Nuget)允许在任何IEnumerable< T>之间创建IDataReader接口.或DataTable.它被轻易地用作sqlBulkcopy的种子,以便最大程度地插入数据.性能进入sql Server表.

此外,为了简化执行SQL查询并解析其结果,Dapper非常棒.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么
长整型输出格式是什么
C语言中文件包含的命令关键字是什么
c程序如何编写x的y次方
c语言开根号代码是什么
c语言怎么进行字符串比较
c语言怎么进行强制类型转换
c语言运算符的优先级顺序是什么
c++用什么软件编程
中序遍历是怎么遍历的
h文件和c文件的关系是什么