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()没有工作,所以我试过
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非常棒. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |