---
title: "Kan jag förbättra den här funktionen?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/166885-kan-jag-förbättra-den-här-funktionen"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "CatZ"
published: "2007-12-03T10:10:51.000Z"
updated: "2007-12-03T13:43:45.000Z"
replies: 11
views: 555
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/166885-kan-jag-förbättra-den-här-funktionen"
---

# Kan jag förbättra den här funktionen?

## #1 — CatZ, 2007-12-03T10:10Z

Jag har två stycken som jag vill ha lite synpunkter på. Den första ser ut som följer: 

```
public List<AdminsList> GetAllAdmins()
{
	//Get data from the database
	string strSQL = "Select [ID], [FullName], [Password], [Email], [WriteAccess], [AdminAccess], [ResultAccess], [Phone], [Active] from Admins";
	using (OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["wbbasConnectionString"].ConnectionString))
	{

		OleDbDataAdapter dbAdapter = new OleDbDataAdapter(strSQL, myCon);
		DataSet ds = new DataSet();
		dbAdapter.Fill(ds, "Admins");
		dbAdapter.Dispose(); //Close the adapter as soon as it is not needed
		myCon.Close(); //Close the connection as soon as it is not needed

		DataTable dt = ds.Tables["Admins"];
		ds.Dispose(); //Close the dataset as soon as it is not needed

		//Declare the list of administrators
		List<AdminsList> adminList = new List<AdminsList>();

		for (int i = 0; i < dt.Rows.Count; i++)
		{
			//Declare each specific administrator and add to the adminList
			AdminsList admin = new AdminsList();

			//Sets all the values in the columns of this specific row
			admin.ID = (int)dt.Rows[i]["ID"];
			admin.FullName = (string)dt.Rows[i]["FullName"];
			admin.Password = (string)dt.Rows[i]["Password"];
			admin.Email = (string)dt.Rows[i]["Email"];
			admin.WriteAccess = (bool)dt.Rows[i]["WriteAccess"];
			admin.AdminAccess = (bool)dt.Rows[i]["AdminAccess"];
			admin.ResultAccess = (bool)dt.Rows[i]["ResultAccess"];
			admin.Phone = (string)dt.Rows[i]["Phone"];
			admin.Active = (bool)dt.Rows[i]["Active"];

			//Adds the row to the collection list
			adminList.Add(admin);
		}//End for
		return adminList;//return the list of Administrators
	}//End using
}//End function
```

Den andra funktionen är jag lite tveksam på. Som det är nu använder jag mig av båda typerna av en enda anledning och det är för att lära mig båda :) 

```
public List<AdminsList> GetAdminByID(int id)
{
	//Get data from the database
	string strSQL = "Select [FullName], [Password], [Email], [WriteAccess], [AdminAccess], [ResultAccess], [Phone], [Active] from Admins where [ID] = ?";
	using (OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["wbbasConnectionString"].ConnectionString))
	{
		OleDbCommand dbCmd = new OleDbCommand(strSQL, myCon);
		dbCmd.Parameters.Add(new OleDbParameter("p1", id));

		myCon.Open();
		OleDbDataReader dbReader = dbCmd.ExecuteReader(CommandBehavior.SingleRow);

		//Declare the list of administrators
		List<AdminsList> adminList = new List<AdminsList>();

		while (dbReader.Read())
		{
			//Declare the admin object
			AdminsList admin = new AdminsList();

			//Sets all the values in the columns of this specific row
			admin.ID = (int) id;
			admin.FullName = (string) dbReader["FullName"].ToString();
			admin.Password = (string) dbReader["Password"].ToString();
			admin.Email = (string) dbReader["Email"].ToString();
			admin.WriteAccess = (bool) dbReader["WriteAccess"];
			admin.AdminAccess = (bool) dbReader["AdminAccess"];
			admin.ResultAccess = (bool) dbReader["ResultAccess"];
			admin.Phone = (string) dbReader["Phone"].ToString();
			admin.Active = (bool) dbReader["Active"];

			//Adds the row to the collection list
			adminList.Add(admin);
		}//End while
		
		dbReader.Close();
		myCon.Close();
		return adminList;
		
	}//End using
}//End function
```

Kan man göra på det här viset eller?

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

## #2 — freguz, 2007-12-03T10:31Z

Jag vet inte exakt vilka delar du tänker på så jag svarar bara lite efter mitt eget huvve :)

i exempel 1
Du skapar ett dataset bara för att fylla en datatable, vilket är en omväg, skapa bara datatable och kör en .Load() på den.

i exempel 2
Förs det första förstår jag inte castningen av en redan castad data, tex (string) dbReader\["Email"\].ToString(); behöver ju inte ha (string) , samma för (int) Id. Men jag antar att detta är ett copy-paste-arv från exempel 1  :birp

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

## #3 — CatZ, 2007-12-03T11:31Z

Du tänkte precis som mig igen freguz :)

> **freguz skrev:**
>
> i exempel 1
> Du skapar ett dataset bara för att fylla en datatable, vilket är en omväg, skapa bara datatable och kör en .Load() på den.

Då känns det iofs lite overkill med ett datatable eftersom jag måste "skapa ett virtuellt datatable programmatiskt, eller kan jag ladda det från min Lista?

> **freguz skrev:**
>
> i exempel 2
> Förs det första förstår jag inte castningen av en redan castad data, tex (string) dbReader\["Email"\].ToString(); behöver ju inte ha (string) , samma för (int) Id. Men jag antar att detta är ett copy-paste-arv från exempel 1  :birp

Jo det var mest slarvfel helt enkelt :) Men är det best practice att köra

```
CommandBehavior.SingleRow
```

 och sedan en while sats om man vill hämta endast en rad?

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

## #4 — freguz, 2007-12-03T12:19Z

> **CatZ skrev:**
>
> Men är det best practice att köra
>
> ```
> CommandBehavior.SingleRow
> ```
>
>  och sedan en while sats om man vill hämta endast en rad?

"if" vore nog mer tydligt och snyggt, men funktionen blir ju densamma som "while"   :bire

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

## #5 — CatZ, 2007-12-03T13:17Z

Nu bättrade jag på min funktion med datatabellen lite. Tack för hjälpen med Load men det verkar ju inte ens behövas? Såhär ser den ut nu.

```
public List<AdminsList> GetAllAdmins()
{
	
	string strSql = "Select [ID], [FullName], [Password], [Email], [WriteAccess], [AdminAccess], [ResultAccess], [Phone], [Active] from Admins";
	using (OleDbConnection dbCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["wbbasConnectionString"].ConnectionString))
	{
		// Create the Command and Adapter
		using (OleDbCommand dbCmd = new OleDbCommand(strSql, dbCon))
		{
			OleDbDataAdapter dbAdapter = new OleDbDataAdapter(dbCmd);

			//Create a DataTable and fill it
			DataTable dt = new DataTable("Admins"); ;
			dbAdapter.Fill(dt);

			//Clean up objects
			dbCon.Close();
			dbAdapter.Dispose();
			dbCmd.Dispose();

			//Declare the list of administrators
			List<AdminsList> adminList = new List<AdminsList>();

			for (int i = 0; i < dt.Rows.Count; i++)
			{
				//Declare the admin object
				AdminsList admin = new AdminsList();

				//Sets all the values in the columns of this specific row
				admin.ID = (int)dt.Rows[i]["ID"];
				admin.FullName = (string)dt.Rows[i]["FullName"];
				admin.Password = (string)dt.Rows[i]["Password"];
				admin.Email = (string)dt.Rows[i]["Email"];
				admin.WriteAccess = (bool)dt.Rows[i]["WriteAccess"];
				admin.AdminAccess = (bool)dt.Rows[i]["AdminAccess"];
				admin.ResultAccess = (bool)dt.Rows[i]["ResultAccess"];
				admin.Phone = (string)dt.Rows[i]["Phone"];
				admin.Active = (bool)dt.Rows[i]["Active"];

				//Adds the row to the collection list
				adminList.Add(admin);
			}//End for
			return adminList;//return the list of Administrators
		}
	}//End using
}//End function
```

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

## #6 — CatZ, 2007-12-03T13:18Z

Ja just det, anledningen till casten är att om ett fält är null så måste jag annars köra en if sats och det är så jäkla fult :)

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

## #7 — freguz, 2007-12-03T13:25Z

Ok, jag hade nog minskat ner koden lite ytterligare och bytt detta

> **CatZ skrev:**
>
> ```
> 	
> 			OleDbDataAdapter dbAdapter = new OleDbDataAdapter(dbCmd);
> 
> 			//Create a DataTable and fill it
> 			DataTable dt = new DataTable("Admins"); ;
> 			dbAdapter.Fill(dt);
> 
> 			//Clean up objects
> 			dbCon.Close();
> 			dbAdapter.Dispose();
> 			dbCmd.Dispose();
> ```

mot

```
* edit: oops du behöver ju en dbCon.Open(); först
dbCon.Open(); 
OleDbCommand dbCmd = new OleDbCommand(strSql, dbCon);
DataTable dt = new DataTable("Admins").Load(dbCmd.ExecuteReader());
dbCon.Close();
```

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

## #8 — CatZ, 2007-12-03T13:37Z

> **freguz skrev:**
>
> ```
> OleDbCommand dbCmd = new OleDbCommand(strSql, dbCon);
> DataTable dt = new DataTable("Admins").Load(dbCmd.ExecuteReader());
> dbCon.Close();
> ```

Error 29 Cannot implicitly convert type 'void' to 'System.Data.DataTable'

Vad säger man om det?  :stud

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

## #9 — CatZ, 2007-12-03T13:38Z

```
//Create a DataTable and fill it
DataTable dt = new DataTable("Admins");
dt.Load(dbCmd.ExecuteReader());
```

fungerar i alla fall utmärkt

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

## #10 — freguz, 2007-12-03T13:40Z

> **CatZ skrev:**
>
> Error 29 Cannot implicitly convert type 'void' to 'System.Data.DataTable'
> 
> Vad säger man om det?  :stud

man säger att jag inte har testat koden   :r 

man får nog göra en 
DataTable dt = new DataTable("Admins"); 
dt.Load();

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

## #11 — freguz, 2007-12-03T13:40Z

ah du hann före :)

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

## #12 — CatZ, 2007-12-03T13:43Z

Jag trodde faktiskt att det inte spelade någon roll, att själva objectet dt i det här fallet skapades i början av raden men tydligen så är inte skapandet av själva objektet färdigt förrens hela raden är exekverad och därför går det inte göra något med objectet förrens nästa rad.

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

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/166885-kan-jag-förbättra-den-här-funktionen
