---
title: "Var bör jag stänga myConnection?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/148435-var-bör-jag-stänga-myconnection"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Sjodahl"
published: "2006-06-26T21:49:36.000Z"
updated: "2006-06-27T17:53:08.000Z"
replies: 10
views: 485
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/148435-var-bör-jag-stänga-myconnection"
---

# Var bör jag stänga myConnection?

## #1 — Sjodahl, 2006-06-26T21:49Z

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.

Permalänk: https://www.webforum.nu/p/148435

## #2 — The_Hulk, 2006-06-27T07:10Z

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?

Permalänk: https://www.webforum.nu/p/1835027

## #3 — Sjodahl, 2006-06-27T07:40Z

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?

Permalänk: https://www.webforum.nu/p/1835037

## #4 — echoSwe, 2006-06-27T07:49Z

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;
		}
	}
```

Permalänk: https://www.webforum.nu/p/1835044

## #5 — Sjodahl, 2006-06-27T08:08Z

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);

Permalänk: https://www.webforum.nu/p/1835056

## #6 — echoSwe, 2006-06-27T08:13Z

> **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.

Permalänk: https://www.webforum.nu/p/1835064

## #7 — Sjodahl, 2006-06-27T08:21Z

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

Permalänk: https://www.webforum.nu/p/1835066

## #8 — echoSwe, 2006-06-27T09:02Z

> **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...

Permalänk: https://www.webforum.nu/p/1835073

## #9 — P, 2006-06-27T11:47Z

> **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.

Permalänk: https://www.webforum.nu/p/1835148

## #10 — Sjodahl, 2006-06-27T13:46Z

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

Permalänk: https://www.webforum.nu/p/1835189

## #11 — P, 2006-06-27T17:53Z

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
```

Permalänk: https://www.webforum.nu/p/1835240

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/148435-var-bör-jag-stänga-myconnection
