Det behöver den...? :q
Hallo. En snabb fråga bara.
OleDbDataReader objDataReader;
Hur kommer det sig att OleDbDataReader ej behöver instansieras med en konstruktor tex såhär:
OleDbDataReader objDataReader=new OleDbDataReader(); ?
9 svar · 608 visningar · startad av Prästen
Hallo. En snabb fråga bara.
OleDbDataReader objDataReader;
Hur kommer det sig att OleDbDataReader ej behöver instansieras med en konstruktor tex såhär:
OleDbDataReader objDataReader=new OleDbDataReader(); ?
Det behöver den...? :q
Ja, och då är inte objektet objDataReader instansierat. Du måste på något sätt skapa en instans, antingen via någon metod i en klass som gör det åt dig, eller själv genom att använda new OleDbDataReader().
men det behövs ju inte verkar det som, här är en lite snippet från MSDN dokumentationen.
public void ReadMyData(string myConnString) {
string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders";
OleDbConnection myConnection = new OleDbConnection(myConnString);
OleDbCommand myCommand = new OleDbCommand(mySelectQuery,myConnection);
myConnection.Open();
OleDbDataReader myReader;
myReader = myCommand.ExecuteReader();
// Always call Read before accessing data.
while (myReader.Read()) {
Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1));
}
// always call Close when done reading.
myReader.Close();
// Close the connection when done with it.
myConnection.Close();
och det går heller inte att instansiera OleDbDataReader såhär:
OleDbDataReader objDataReader=new OleDbDataReader();
eftersom den saknar en konstruktor.
finns inget att instansiera liksom
:l
Metoden ExecuteReader() i klassen OleDbCommand skapar en instans av klassen OleDbDataReader och returnerar sedan den. Därför kan du sedan använda den. Du kan aldrig använda ett objekt som du har tilldelat null. Det är alltså metoden ExecuteReader() som sköter all instansiering åt dig, men den sker utan att du behöver bry dig. :)
Den saknar inte konstruktor, utan den är antagligen deklarerad som privat eller skyddad ( private eller protected alltså ). Endast den egna klassen eller en subklass kan då skapa en instans av klassen OleDbDataReader. Instansiering måste ske för att man ska kunna använda ett objekt.
men va skumt, en annan klassmetod sköter instansieringen av ett annat objekt, vad kallas det och var kan man läsa lite om det?.
Ja du, jag vet inte om det har något namn eller om man kan läsa någonstans om det. Men det är inte så krångligt, det är i stort sett som vanlig instansiering. Se följande klasser.
class MyA {
private MyA() { }
public static MyA getInstance() {
MyA myinstance = new MyA(); // Endast den egna klassen kan komma åt konstruktorn i MyA som deklarerades privat
return myinstance;
}
}
class MyB {
public void Something() {
MyA mya = new MyA(); // Fungerar [b]inte[/b], eftersom att konstruktorn för MyA deklarerades privat
MyA mya = MyA.getInstance(); // Fungerar, eftersom att metode returnerar en instans av klassen MyA
}
}
Följande bör fungera smärtfritt också:
class MyA {
protected MyA() {}
...
}
class MyB : MyA {
public MyA createMyAInstance() {
MyA mya = new MyA();
return mya;
}
}
class MyC {
public void Something() {
MyB myb = new MyB();
MyA mya = myb.createMyAInstance();
}
}
Eftersom att konstruktorn för MyA är deklarerad protected så kommer endast subklasser åt den. På det här sättet fungerar det troligtvis med OleDbCommand och OleDbDataReader.