Создание второго запроса к базе данных на основе первого - PullRequest
1 голос
/ 05 марта 2011

Итак, я переношу устаревшее приложение с coldfusion на asp.net/c#. Моя проблема в том, что (и я все это искал, но, возможно, я не формулирую свою проблему должным образом, чтобы получить хорошие результаты), я хочу взять свои результаты из первого запроса, который я имею, и выполнить второй запрос заполнить этот столбец.

Вот как я это сделал в Coldfusion:

<cfquery name="p" datasource="db">
   select * from table
</cfquery>

<cfloop query="p">
   <tr>
      <td>
         <a href="page.cfm?id=#p.id#">#p.title#</a>
      </td>
      <td">
         #p.category#
      </td>
      <td>
         #CreateObject("component","/components.dao").getuser(p.userid).user_fullname()#
      </td>
   </tr>
</cfloop>

Вы заметите, что я вызываю компонент и метод, которые также отправляют идентификатор пользователя из запроса. У этого метода есть другой запрос, который вызывает отдельную базу данных и возвращает информацию об этом пользователе, в данном случае полное имя, а не просто идентификатор пользователя. Вот где у меня проблемы в asp.net/c#, для этого я создал следующий код:

<asp:Repeater id="program_list" runat="server">
   <ItemTemplate>
      <tr>
         <td>
            <a href="page.aspx?id=<%# Eval("id") %>"><%# Eval("title") %></a>
         </td>
         <td>
            <%# Eval("category") %>
         </td>
         <td>
            <%# Eval("userid")%> (needs full name convert)
         </td>
      </tr>
   </ItemTemplate>
</asp:Repeater>

и в коде

protected void Page_Load(object sender, EventArgs e)
{
   try
   {
      DbConnection connection = new SqlConnection();
      connection.ConnectionString = "***";
      connection.Open();

      SqlCommand cmd = (SqlCommand)connection.CreateCommand();
      cmd.CommandType = CommandType.Text;
      cmd.CommandText = "SELECT * FROM table";

      SqlDataReader reader = null;
      reader = cmd.ExecuteReader();
      program_list.DataSource = reader;
      program_list.DataBind();
      reader.Close();
      connection.Close();
   }
   catch (Exception ex)
   {
      Response.Write(ex);
   }
}

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

Ответы [ 2 ]

0 голосов
/ 05 марта 2011

, поэтому вам нужно вызывать sql-запрос для каждой строки повторителя. Вы должны использовать ItemDataBoundEvent, в этом случае вы можете обработать строки user_id и сделать еще один запрос.

например

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        DataRowView drw = (DataRowView)e.Item.DataItem
        String sql = String.Format("Select * FROM UserInfo WHERE user_id={0}", drw["user_id"]);


        Label lblUserName = (Label) e.Item.FindControl("lblUserName");
        lblUserName.Text = //WWhatever you get from query...
    }
0 голосов
/ 05 марта 2011

Вы ищете событие ItemDataBound . Вы можете сделать запрос в этом событии и заполнить другие элементы управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...