webForumDet fria alternativet

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

.NET

11 svar · 523 visningar · startad av CatZ

Medlem sedan jan. 20022 440 inlägg
Frågan#1

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?

Medlem sedan feb. 2005280 inlägg
#2

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

Medlem sedan jan. 20022 440 inlägg
#3

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?

Medlem sedan feb. 2005280 inlägg
#4

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

Medlem sedan jan. 20022 440 inlägg
#5

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
Medlem sedan jan. 20022 440 inlägg
#6

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

Medlem sedan feb. 2005280 inlägg
#7

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();
Medlem sedan jan. 20022 440 inlägg
#8

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

Medlem sedan jan. 20022 440 inlägg
#9
//Create a DataTable and fill it
DataTable dt = new DataTable("Admins");
dt.Load(dbCmd.ExecuteReader());

fungerar i alla fall utmärkt

Medlem sedan feb. 2005280 inlägg
#10

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

Medlem sedan feb. 2005280 inlägg
#11

ah du hann före :)

Medlem sedan jan. 20022 440 inlägg
#12

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.

270 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)