2011-03-04 115 views
1

因此,我将一个遗留应用程序从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> 

你会发现我所说的组件和方法,我从查询发送用户ID了。此方法有另一个查询调用单独的数据库,并返回该用户的信息,在这种情况下是全名,而不仅仅是用户标识。这是我有对我已经创建了下面的代码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); 
    } 
} 

正如你所看到的,它只做第一部分,输出原始查询,但我不知道如何与该查询进行交互,以便第二次为用户详细信息调用数据库。任何想法将不胜感激,谢谢。

+0

我可能失去了一些东西,但是你就不能使用你的SQL联接? – RandomWebGuy 2011-03-04 22:35:14

回答

0

所以你需要调用一个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

这绝对看起来像我需要,但DataRowView drw =(DataRowView)e.Item.DataItem'给出一个错误:'System.Data.Common.DataRecordInternal'键入'System.Data.DataRowView'任何想法是什么? – Josh 2011-03-04 23:21:32

+0

System.Data.Common.DbDataRecord rd =(System.Data.Common.DbDataRecord)e.Item.DataItem;试试这个。 – adt 2011-03-04 23:35:55

+0

工作完美,谢谢。 – Josh 2011-03-04 23:48:29

0

您正在寻找ItemDataBound活动。您可以在该事件中执行查询并填充其他控件。