Я не могу отказаться от этой возможности включить книгу Josh Bloch Эффективный Java (2-й Выпуск). Глава 11 является необходимым ресурсом на сериализации Java.
На Josh, автоматически сгенерированный UID сгенерирован на основе имени класса, реализовал интерфейсы и всю общественность и защитил участников. Изменение любого из них всегда изменится serialVersionUID
. Таким образом, Вы не должны смешивать с ними, только если Вы уверены, что не больше, чем одна версия класса будет когда-либо сериализироваться (или через процессы или получаться от устройства хранения данных в более позднее время).
, Если Вы игнорируете их на данный момент и находите позже, что необходимо изменить класс в некотором роде, но поддержать совместимость w/старая версия класса, можно использовать инструмент JDK serialver, чтобы генерировать serialVersionUID
на старый класс, и явно установить это на новом классе. (В зависимости от Ваших изменений Вы, возможно, должны также реализовать пользовательскую сериализацию путем добавления writeObject
и readObject
, методы - видят Serializable
javadoc или вышеупомянутая глава 11.)
У вас должна быть возможность напрямую привязать SqlDataReader к раскрывающемуся списку следующим образом:
MyDropDownList.DataSource = GetModels();
MyDropDownList.DataTextField = "ModelName";
MyDropDownList.DataValueField = "ModelID";
Также необходимо указать, какой элемент (свойство) будет отображаться (DataTextField), и какое из них будет использоваться в качестве значения при выборе записи в раскрывающемся списке (DataValueField).
Я бы настоятельно рекомендовал получить данные из SqlDataReader в вашем GetModels ()
, создайте экземпляры класса Model
, который будет содержать те поля, которые вам нужны и нужны, закройте SqlDataReader, а затем верните его как List
и свяжите этот список в раскрывающийся список. НАМНОГО лучше, чем прямая привязка SqlDataReader!
public class Model
{
public int ModelID { get; set; }
public string ModelName { get; set; }
}
И в ваших GetModels ():
public List<Model> GetModels()
{
List<Model> result = new List<Model>();
using(SqlConnection conn = new SqlConnection(ConfigurationManager.
ConnectionStrings["SampleCs"].ConnectionString))
{
using(SqlCommand cmd = new SqlCommand("SP_GetModels", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@CategoryID", SqlDbType.BigInt, 10).Value = CategoryID;
conn.Open();
using(SqlDataReader dreader = cmd.ExecuteReader())
{
while(dreader.Read())
{
Model workItem = new Model()
{ ModelID = dreader.GetInt(0),
ModelName = dreader.GetString(1) };
result.Add(workItem);
}
reader.Close();
}
conn.Close();
}
}
return result;
}
Marc
Во-первых, убедитесь, что загрузчик данных автоматически закрывается при его возврате:
SqlDataReader dreader= cmd.ExecuteReader(CommandBehavior.CloseConnection);
Затем для привязки к списку:
DropDownList1.DataSource = GetModels();
DropDownList1.DataValueField = "ModelID";
DropDownList1.DataTextField = "ModelName";
DropDownList1.DataBind();
Я не думаю, что SqlDataReader унаследован от IListSource, и, если я правильно помню, вы можете использовать только классы, унаследованные от IListSource для данных привязка. Если вы хотите получить DataTable, вместо этого вы должны использовать SqlDataAdapter для выполнения команды. Расширение решения Марка:
public void BindData()
{
dropDownList1.DataSource = LoadModelData();
dropDownList1.DataValueField = "ModelID";
dropDownList1.DataTextField = "ModelName";
dropDownList1.DataBind();
}
public DataTable LoadModelData()
{
DataSet dataset = new DataSet();
using (conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SampleCs"].ConnectionString))
{
SqlCommand cmd = new SqlCommand("SP_GetModels", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@CategoryID", SqlDbType.BigInt, 10).Value = CategoryID;
SqlDataAdapter adapter = new SqlDataAdapter(cmd, conn);
adapter.Fill(dataset);
}
return dataset.Tables[0];
}
how about this one
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
DropDownList1.Items.Add(new ListItem(dr["ModelName"].ToString(), dr["ModelID"].ToString()));
}
con.Close();