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