Как получить данные в результате хранимой процедуры - PullRequest
5 голосов
/ 08 августа 2009

Следующая моя хранимая процедура.

ALTER PROCEDURE SP_GetModels 
(
    @CategoryID bigint
)
AS
BEGIN
    Select ModelID,ModelName From Model where CategoryID=@CategoryID
END

и я вызываю хранимую процедуру в коде как

public SqlConnection conn;
 public SqlDataReader   GetModels()
        { 


         DataTable dt = new DataTable();
     public void DbConnection()
            {
                conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SampleCs"].ConnectionString);
                conn.Open();
            }
                DbConnection();
                SqlCommand cmd = new SqlCommand("SP_GetModels", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@CategoryID", SqlDbType.BigInt, 10).Value = CategoryID;
               // SqlDataAdapter madap = new SqlDataAdapter(cmd, conn);
                SqlDataReader dreader= cmd.ExecuteReader();

                //madap.Fill(dt);
                return dreader;
            }

У меня есть выпадающий список, к которому я должен привязать объект чтения данных, содержащий имя модели. Как я могу установить источник данных в раскрывающемся списке как datareader

Ответы [ 5 ]

10 голосов
/ 05 февраля 2012
private void PopDataBaseName()
{
    try
    {
        SqlCommand cmd = new SqlCommand("sp_generate_report", con);
        cmd.Parameters.Add("@TABLE_NAME", SqlDbType.VarChar,100).Value = TextBox1.Text;
        cmd.CommandType = CommandType.StoredProcedure;
        SqlDataAdapter adp = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        adp.Fill(ds);

    }
    catch (Exception ex)
    {

    }
}
2 голосов
/ 08 августа 2009

Вы должны иметь возможность напрямую привязать SqlDataReader к раскрывающемуся списку следующим образом:

MyDropDownList.DataSource = GetModels();
MyDropDownList.DataTextField = "ModelName";
MyDropDownList.DataValueField = "ModelID";

Необходимо также указать, какой элемент (свойство) будет отображаться (DataTextField), а какой будет использоваться в качестве значения при выборе записи в раскрывающемся списке (DataValueField).

Я бы настоятельно рекомендовал захватить данные из SqlDataReader в вашей процедуре GetModels(), создать экземпляры класса Model, который будет содержать те поля, которые вам нужны, закрыть SqlDataReader и затем верните его как List<Model> и привяжите этот список к выпадающему списку. НАМНОГО лучше, чем прямое связывание 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;
}

Марк

1 голос
/ 22 августа 2009

Я не думаю, что 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 голос
/ 08 августа 2009

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

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

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

 DropDownList1.DataSource = GetModels();
 DropDownList1.DataValueField = "ModelID";
 DropDownList1.DataTextField = "ModelName";
 DropDownList1.DataBind();
0 голосов
/ 27 августа 2009

как насчет этого

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

            }
            con.Close();
...