Har en liten fundering har lite kod som ser ut så här:
karnan.CarsDB [B]CarsDB[/B] = new karnan.CarsDB();
SqlDataReader dr2 = null;
dr2 = [B]CarsDB.GetCarList();[/B]
while (dr2.Read())
{
....
}
dr2.Close();
CarsDB filen ser ut så här:
public SqlDataReader GetCarList()
{
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["connectionString"]);
SqlCommand myCommand = new SqlCommand("GetCars", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
[B]myConnection.Open(); // ÖPPNAR MEN VAR STÄNGER JAG?[/B]
SqlDataReader result = myCommand.ExecuteReader(CommandBehavior.CloseConnection); [B]// STÄNGS DEN HÄR TRO? Fast bara om det går rätt till?[/B]
return result;
}
Problemet är att jag inte vet när jag skall köra en myConnection.Close
Kör jag den innan jag returnerar min SqlDataReader result får jag felmeddelande att den är stängd.
Får ett felmeddelande att jag har använt upp alla anslutningar efter att den har rullat ett tag och man tryckt runt lite för mycket.
Vet inte kan kanske deklarera den överst och använda den flera gånger istället?
Men tycker det borde gå att öppna och stänga med på ett smidigt sätt, men kanske är mer krävande?
namespace DataLayer
{
public delegate object BorrowReader(IDataReader oReader);
public class DataServices
{
public static object LendReader(string sql, BorrowReader borrower)
{
using (MySqlConnection objConn = DataServices.CreateConnection())
{
objConn.Open();
MySqlCommand oCmd = new MySqlCommand(sql, objConn);
MySqlDataReader oRdr = oCmd.ExecuteReader();
return borrower(oRdr);
}
}
public static MySqlConnection CreateConnection()
{
MySqlConnection c = new MySqlConnection(
"Server=localhost;Database=asd;Uid=hasdade;Pwd=3asdasd;Port=3307;");
return c;
}
}
}
Det kanske är något att satsa på? Då öppnas den av objConn.Open(); stängs av using-uttrycket. Din DataReader kan även vara av vilken typ (vilken databas-) som helst eftersom du använder ett Interface.
Sedan kan du använda den såhär:
class ShowBorrowing
{
static void Main(string[] args)
{
string sel = "SELECT * FROM blog_entries";
try
{
DataServices.LendReader(sel, new BorrowReader(GetNames));
}
catch (Exception e)
{
Console.WriteLine("There was an error: ");
Console.WriteLine(e.Message.ToString());
}
string hej = Console.ReadLine();
}
private static object GetNames(IDataReader reader)
{
try
{
while (reader.Read())
{
Console.WriteLine(reader["title"]);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
}
return null;
}
}
Men jag har rätt när jag säger att den inte stängs av denna raden?
SqlDataReader result = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
Nej, du har fel, tror jag. Den raden betyder, till min förståelse, att myCommand stänger din datareader vid EOF. Att du sedan försöker stänga den igen har förmodligen ingen betydelse.
NU har jag inte läst detta så noga men du har kommit fram till att du måste stänga din datareader? Alltså:
myConnection.Open(); // ÖPPNAR MEN VAR STÄNGER JAG?
SqlDataReader result = myCommand.ExecuteReader(CommandBehavior.CloseConnection); // STÄNGS DEN HÄR TRO? Fast bara om det går rätt till?
return result;
Där du anropar sen så måste du:
DataReader result = FunktionFrånOvan();
//gör grejer med reader...
result.Close() ; Då stängs anslutningen eftersom du har CommandBehavior.CloseConnection
126 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17