webForumDet fria alternativet

Var bör jag stänga myConnection?

.NETur .NET

10 svar · 482 visningar · startad av Sjodahl

Medlem sedan maj 20033 218 inlägg
Frågan#1

Hej!

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.

Medlem sedan juni 20031 837 inlägg
#2

Måste du öppna en connection varje gång du gör ett anrop?
Går det inte att spara connection för alla anrop?

Medlem sedan maj 20033 218 inlägg
#3

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?

Medlem sedan nov. 20041 189 inlägg
#4

Så beskrev "Design Patterns in C#" din fråga.

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;
		}
	}
Medlem sedan maj 20033 218 inlägg
#5

Verkar bra ovan, skall ta en titt.

Men jag har rätt när jag säger att den inte stängs av denna raden?

SqlDataReader result = myCommand.ExecuteReader(CommandBehavior.CloseConnection);

Medlem sedan nov. 20041 189 inlägg
#6

Sjodahl skrev:

Verkar bra ovan, skall ta en titt.

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.

Medlem sedan maj 20033 218 inlägg
#7

Okej stänger inte min SQL anslutning då alltså.

Medlem sedan nov. 20041 189 inlägg
#8

Sjodahl skrev:

Okej stänger inte min SQL anslutning då alltså.

Om du gör fel och lämnar den öppen får du runtime error...

Medlem sedan jan. 20012 204 inlägg
#9

Sjodahl skrev:

Okej stänger inte min SQL anslutning då alltså.

I annat fall kommer du märka det då mysql krashar då det är för många anslutningar.

Medlem sedan maj 20033 218 inlägg
#10

Japp får ett felmeddelande att alla anslutningar är upptagna ;)
Kollar på det och återkommer så fort jag har tid. Tackar!

Medlem sedan jan. 20012 204 inlägg
#11

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
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)