आप एक राज्य मशीन है कि झांकना मोड बनाम नियमित मोड पटरियों बना सकते हैं। हो सकता है कि कुछ इस तरह (सिर्फ उन्हें सभी एक ही Peeker.cs बुलाया फ़ाइल या ऐसा ही कुछ में टॉस सकता है): overkill की
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;
}
}
तरह है, लेकिन ओह अच्छी तरह से।
आप बस अनुसरण करना होगा इसका इस्तेमाल करने के लिए:
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);
तो फिर आप अपने पंक्ति के साथ क्या करने की जरूरत है। ऑब्जेक्ट सरणी का उपयोग करने से बेहतर तरीका हो सकता है, लेकिन आपको बिंदु मिल जाता है।
शुभकामनाएं!
स्रोत
2009-05-21 18:12:39
आपका उदाहरण काम नहीं करता है, क्योंकि 'IDataReader' इंटरफ़ेस में आपकी' .Peek' विधि नहीं है। आपको स्पष्ट रूप से उपयोग करने वाले स्कोप चर को 'PeekDataReader' के रूप में टाइप करना चाहिए या' var' का उपयोग करना चाहिए। – julealgon