Как получить таблицу данных в результате хранимой процедуры

Я не могу отказаться от этой возможности включить книгу Josh Bloch Эффективный Java (2-й Выпуск). Глава 11 является необходимым ресурсом на сериализации Java.

На Josh, автоматически сгенерированный UID сгенерирован на основе имени класса, реализовал интерфейсы и всю общественность и защитил участников. Изменение любого из них всегда изменится serialVersionUID. Таким образом, Вы не должны смешивать с ними, только если Вы уверены, что не больше, чем одна версия класса будет когда-либо сериализироваться (или через процессы или получаться от устройства хранения данных в более позднее время).

, Если Вы игнорируете их на данный момент и находите позже, что необходимо изменить класс в некотором роде, но поддержать совместимость w/старая версия класса, можно использовать инструмент JDK serialver, чтобы генерировать serialVersionUID на старый класс, и явно установить это на новом классе. (В зависимости от Ваших изменений Вы, возможно, должны также реализовать пользовательскую сериализацию путем добавления writeObject и readObject, методы - видят Serializable javadoc или вышеупомянутая глава 11.)

5
задан marc_s 8 August 2009 в 15:21
поделиться

4 ответа

У вас должна быть возможность напрямую привязать 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

2
ответ дан 18 December 2019 в 13:17
поделиться

Во-первых, убедитесь, что загрузчик данных автоматически закрывается при его возврате:

 SqlDataReader dreader= cmd.ExecuteReader(CommandBehavior.CloseConnection);

Затем для привязки к списку:

 DropDownList1.DataSource = GetModels();
 DropDownList1.DataValueField = "ModelID";
 DropDownList1.DataTextField = "ModelName";
 DropDownList1.DataBind();
1
ответ дан 18 December 2019 в 13:17
поделиться

Я не думаю, что 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];
}
1
ответ дан 18 December 2019 в 13:17
поделиться

how about this one

SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                DropDownList1.Items.Add(new ListItem(dr["ModelName"].ToString(), dr["ModelID"].ToString()));

            }
            con.Close();
0
ответ дан 18 December 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: