- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经让一个自定义类继承IDataReader
并且已经成功使用自定义类实现自定义 ServerWriter sqlBulkCopy
,该自定义类使用 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;
}
}
对象被精确映射为它对应的 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())
{
}
写入服务器时它确实有效,我如何使用 Read
正确实现它?
更新
关于我的模块的更多信息
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
的一个实例.
各种解决方案:
走极端就自己写IDbProviderFactory
包裹着 SqlConnection
有自己的连接、命令和数据读取器类。
例如,这就是 Miniprofiler 用来检测所有 SQL 请求并收集执行时间、行数等的工作。Source code
或者你可以用某种扩展方法只包装阅读器,像这样:sqlCmd.ExecuteReader().AsMyReader()
.什么AsMyReader()
会做的是返回自定义 IDataReader
做你的事情并委托(delegate)给实际的SqlDataReader
.
我不太确定您在阅读内容时想要达到什么目的,但在这个领域存在不错的库。无需提出自己的解决方案。
FastMember ( Nuget ) 允许创建 IDataReader
任何IEnumerable<T>
周围的接口(interface)或 DataTable
.它可以很容易地用作 SqlBulkCopy
的种子。轻松插入最大数据。将性能转化为 SQL Server 表。
此外,为了简化 SQL 查询的执行和解析其结果,Dapper太棒了。
关于c# - 使用继承的自定义 IDataReader 从 IDbCommand 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986901/
我有两种情况从IDataReader对象中提取信息 Case - 1 - 长度,计算序数然后解析字符串 public static string GetString(IDataReader rdr,
我正在编写一个类,它封装了使用 ADO.NET 从数据库中检索数据的复杂性。其核心方法是 private void Read(Action action) where T : class, new()
实际上不一定是 IDataReader . 我有一个类似这样的函数: public IEnumerable GetObjects() { IDataReader dr = GetSomeDataR
我有一个看起来像这样的 XML: Row 1 - Col 1 Row 1 - Col 2 Row 1 - Col 3 ...
出于某种原因,这段代码: MethodInfo iDataReaderIndexerProperty = typeof(IDataReader).GetProperties() .Single
我正在尝试创建一个“Helper”类,您只需在其中传递驱动程序和参数,该类就会为您执行连接和连接字符串组装。 我一直在使用 System.Data 的接口(interface),例如 IDataRea
这个问题在这里已经有了答案: Does casting create new object? (3 个答案) 关闭 4 年前。 假设我创建了一个数据读取器。 我的数据库类中有一个方法 - 以这种方式
如何使用泛型将 DataReader 对象映射到类对象? 例如我需要做以下事情: public class Mapper { public static List MapObj
谁能告诉我这两段代码的区别?为什么要使用 IDataReader? using (IDataReader reader = cmd.ExecuteReader()) { while (read
在使用 reader.Read(); 遍历行之前,是否有任何方法可以获取从 SQL 查询(从 IDataReader)返回的总行数? 最佳答案 没有。 IDataReader 是结果集的简单只进 Vi
我有一个 List有一百万个元素。 (它实际上是一个 SubSonic Collection 但它不是从数据库加载的)。 我目前使用 SqlBulkCopy 如下: private string Fa
我继承的典型查询执行模式是这样的: using (IDataReader r = query.ExecuteReader()) { while (r.Read()) { // etc.
我正在考虑在 IDataReader 上模拟一个扩展方法(在项目中使用) . ReadAll()时我想返回一个测试数据集合(下)被调用。 public static IEnumerable ReadA
我正在尝试确定代码库中是否存在明显的错误。 有问题的代码调用第三方 dll,它返回一个 IDataReader。如果代码使用读取器而不处理它,它不会显式返回到池中,对吗? 调用代码如下: IDataR
我正在为 map 实体和数据集使用 AutoMapper AutoMapper.Mapper.CreateMap(): 并且我在 Home 实体中有一个名为 MobileNumber 的属性,并且想在
我正在做一个大规模的插入/更新操作。 所以我正在使用 SqlBulkCopy。 SqlConnection myConnection = new SqlConnection(myConnectionS
我在窗口 C# vs05 上工作。我想通过 IDataReader 读取图像....在 oledb 中....我该怎么做假设我想从数据库列名称学生 ID 中读取 int 值然后我用下面的方式编写代码
我想从数据库中读取数据到列表。 我试过下面的代码 public List StoredProcedureForIList(string spName, params IDataParameter[]
我正在尝试将 SQL 数据库中的数据(1 个表中的 4 列)加载到一个列表中,到目前为止已经完成了 List FNameList = (from IDataRecord r in myReader
在使用 IDataReader 对象(DbDataReader)中包含的信息加载它后,我试图向 DataTable 添加一个新条目> 具体来说。加载顺利,我认为对数据库的查询是正确的。 尝试添加新行时
我是一名优秀的程序员,十分优秀!