è possibile creare una macchina a stati che tiene traccia peek-mode vs regular-mode. Forse qualcosa di simile (potrebbe semplicemente li gettare in un unico file chiamato Peeker.cs o qualcosa di simile):
public sealed class Peeker
{
internal readonly PeekMode PEEKING;
internal readonly NormalMode NORMAL;
private ReadState _state;
public Peeker()
{
PEEKING = new PeekMode(this);
NORMAL = new NormalMode(this);
// Start with a normal mode
_state = NORMAL;
}
public object[] OnRead(IDataReader dr, bool peek)
{
return _state.OnRead(dr, peek);
}
internal void SetState(ReadState state)
{
_state = state;
}
}
internal abstract class ReadState
{
protected Peeker _peeker;
protected ReadState(Peeker p)
{
_peeker = p;
}
public abstract object[] OnRead(IDataReader dr, bool peek);
}
internal class PeekMode : ReadState
{
public PeekMode(Peeker p)
: base(p)
{
}
public override object[] OnRead(IDataReader dr, bool peek)
{
object[] datarow = new object[dr.FieldCount];
if (peek)
{
dr.GetValues(datarow);
}
else
{
if (dr.Read())
{
dr.GetValues(datarow);
_peeker.SetState(_peeker.NORMAL);
}
}
return datarow;
}
}
internal class NormalMode : ReadState
{
public NormalMode(Peeker p)
: base(p)
{
}
public override object[] OnRead(IDataReader dr, bool peek)
{
object[] datarow = new object[dr.FieldCount];
if (peek)
{
if (dr.Read())
{
dr.GetValues(datarow);
_peeker.SetState(_peeker.PEEKING);
}
}
else
{
if (dr.Read())
{
dr.GetValues(datarow);
}
}
return datarow;
}
}
Tipo di eccessivo, ma vabbè.
Per usarlo si dovrebbe solo fare quanto segue:
Peeker p = new Peeker();
.
.
.
SomeDataReaderType dr = SomeCommandType.ExecuteReader();
.
.
.
// To peek
object[] myDataRow = p.OnRead(dr, true);
// or not to peek
object[] myDataRow = p.OnRead(dr, false);
poi fare quello che devi fare con la tua linea. Potrebbe esserci un modo migliore rispetto all'utilizzo di un array di oggetti, ma ottieni il punto.
Buona fortuna!
fonte
2009-05-21 18:12:39
L'esempio non funziona, poiché l'interfaccia 'IDataReader' non contiene il tuo metodo' .Peek'. Dovresti digitare esplicitamente la variabile scope usando come 'PeekDataReader' o usare' var'. – julealgon