C# 使用继承的自定义IDataReader读取IDB命令
我已经创建了一个自定义类继承C# 使用继承的自定义IDataReader读取IDB命令,c#,sql-server,performance,downcast,idatareader,C#,Sql Server,Performance,Downcast,Idatareader,我已经创建了一个自定义类继承IDataReader,并已成功 使用自定义类实现了一个自定义ServerWritersqlBulkCopy,该自定义类使用C对象而不是DataTable 正如我所怀疑的那样,这证明是一种更有效的方法 现在我正在试着阅读,我遇到了一些问题 这是IDataReader: // get Server Data Table Object IDataReader public class GetSDTOIDataReaderM : IDataReader { //pri
IDataReader
,并已成功
使用自定义类实现了一个自定义ServerWritersqlBulkCopy
,该自定义类使用C对象而不是DataTable
正如我所怀疑的那样,这证明是一种更有效的方法
现在我正在试着阅读,我遇到了一些问题
这是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;
}
}
当写入到服务器时,它确实起作用,如何使用读取正确实现它?
更新
更多关于我的模块
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; }
}
公共类TransManSF
{
公共枚举通信类型{Reader,Adapter,GetSDTOReaderA,SqlBcpyIDataReaderM};
公共枚举DbIntreactorTypeS{TableObject,TableRowObject,存储过程,SqlCmd};
公共枚举SqlCmdActionS{NotSet、SELECT、INSERT、UPDATE、DROP};
公共枚举SqlCmdStrSelModeS{Single,recenteffected,count,All,Top10,Top100,Top1000};
公共枚举SQLCMDSTRESORDERBYS{NotSet=0,Asc=1,Desc=2};
公共枚举SQLCMDSTResterModes{Single,Multi};
公共枚举STDOTypeS{NotSet,ServerWriter,ServerTableGetter,serverbiderconditional}
公共枚举存储类型{Sproc,TvPSrpoc}
公共枚举TransexeCationTypes{WriteToServer,GetTable}
}
公共静态TransMan.Raw.comunicatorcf.BulkCopyComSCL AsBulkCopyCom(此TransMan.Raw.comunicatorcf.ComunicatorM SelfCom)
{
返回(TransMan.Raw.Comunicatorcf.BulkCopyComSCL)SelfCom;
}
虚拟public void ExecuteTransaction(AppMods.DataBase.TransManSF.transexecationtypes parSelectedTransType,TransManSF.sqlcmdstrestorderbys parExecOrderByS,int OrderByOrdinal=0)
{
if(ParseSelectedTransType==AppMods.DataBase.TransManSF.TransexeCationTypes.WriteToServer)
使用(this.propComunicator.AsBulkCopyCom().Conn)
{
this.propComunicator.AsBulkCopyCom().Conn.Open();
使用(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(parseselectedtranstype==AppMods.DataBase.TransManSF.transexecationtypes.GetTable)
{
var DreaderCom=this.propcom.AsDReaderCom();
使用(DreaderCom.SqlCmd.Connection)
{
DreaderCom.SqlCmd.Connection.Open();
使用(DreaderCom.Driver=DreaderCom.SqlCmd.ExecuteReader())
{
if(DreaderCom.Driver.HasRows)while(DreaderCom.Driver.Read())
{
对于(int i=0;i
简短回答:无法更改由SqlCommand.ExecuteReader()返回的类型
它将始终是SqlDataReader
的实例
各种解决方案:
1.把东西包装在对你有意义的地方。
如果您走极端,请编写自己的IDbProviderFactory
,它用自己的连接、命令和数据读取器类包装SqlConnection
例如,这就是Miniprofiler用来检测所有SQL请求并收集执行时间、行数等的功能
或者您可以使用某种扩展方法包装读取器,如:sqlCmd.ExecuteReader().AsMyReader()
。AsMyReader()
要做的是返回一个定制的IDataReader
,它完成您的工作并委托给实际的SqlDataReader
2使用现有的助手库
我不太确定你在阅读材料时想要达到什么目的,但在这个领域里有很好的图书馆。没有必要提出自己的解决方案
()允许围绕任何IEnumerable
或DataTable
创建IDataReader
接口。它是制造的
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; }
}