【问题标题】:Loop inside loop for .Net C#.Net C#的循环内循环
【发布时间】:2018-01-11 00:57:57
【问题描述】:

在我输入的 User_id 通过 Reference_id 从表中相互引用之后,我想检索所有 User_id 的下一个,下面的代码给出了确切的结果,但它检索了从“2001 到 2005”的所有 User_id。

如果我从文本框中输入“2002”作为 User_id,那么它必须从“2003 - 2005”中检索

Table_xyz 列 User_id 的值 = 2001、2002、2003、2004、2005 Table_xyz 列 Reference_id 的值 = 2000, 2001, 2002, 2003, 2004

var gCmd = new SqlCommand(@"SELECT User_id FROM Table_xyz", nCon);
SqlDataAdapter Sda = new SqlDataAdapter(gCmd);
DataTable Dt = new DataTable();
Sda.Fill(Dt);

for (int i = 0; i < Dt.Rows.Count; i++)
{
    string referenceid = Dt.Rows[i]["User_id"].ToString();

    var gCmd1 = new SqlCommand(@"SELECT User_id FROM Table_xyz 
    WHERE Reference_id = '" + referenceid + "'", nCon);

    SqlDataAdapter Sda1 = new SqlDataAdapter(gCmd1);
    DataTable Dt1 = new DataTable();
    Sda1.Fill(Dt1);

    Response.Write(referenceid);
}         

我尝试将“SELECT User_id FROM Table_xyz WHERE User_id = '2001'”添加到第一个命令,但它只返回一个 User_id 匹配“2001”的值

【问题讨论】:

  • 这段代码遇到了什么问题,?您是否进行了调试以找出问题所在?
  • 是的,没有错误,但我认为我不理解逻辑,它只返回第一个值而不是休息
  • 它只返回一个值,因为循环只运行一次。这个数组var array = list.ToArray();只有一个值。

标签: c# asp.net .net


【解决方案1】:

感谢所有帮助我的朋友,但不幸的是,这并没有解决主要问题。

经过大量研究后,我在“递归命令”中得到了答案,所以最后我的代码如下

        string value = "2723022"; // <== any reference id from Reference_id column
        String gCmd = "SELECT DISTINCT Reference_id FROM myTable WHERE User_id >'" + value + "'";
        SqlDataAdapter Sda = new SqlDataAdapter();
        Sda.SelectCommand = new SqlCommand(gCmd, nCon);
        DataTable Dt = new DataTable();
        Sda.Fill(Dt);

        for (int count = 0; count < Dt.Rows.Count; count++)
        {
            string dCmd = "SELECT User_id FROM dEmo_aCcounts WHERE Reference_id = '" + Dt.Rows[count]["Reference_id"] + "'";
            SqlDataAdapter dSda = new SqlDataAdapter();
            dSda.SelectCommand = new SqlCommand(dCmd, nCon);
            DataTable dDt = new DataTable();
            dSda.Fill(dDt);

            for (int i = 0; i < dDt.Rows.Count; i++)
            {
                Response.Write(dDt.Rows[i]["User_id"]);
            }
        }

【讨论】:

    【解决方案2】:

    你可以试试这个解决方案,首先你可以得到所有不同的Refrence_ID,然后你可以循环得到IDs

    var gCon = ConfigurationManager.ConnectionStrings["myCon"].ConnectionString;
    using (var nCon = new SqlConnection(gCon))
    {
        try
        {
            nCon.Open();
            String cmd = "SELECT DISTINCT Refrence_ID FROM TableA";
            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = new SqlCommand(cmd, nCon);
            DataTable Dt = new DataTable();
            adapter.Fill(Dt);
    
            for (int count = 0; count < Dt.Rows.Count(); count++)
            {
                string dCmd = "SELECT ID FROM TableA WHERE Reference_ID = '" + dt.Rows[count]["Refrence_ID"] + "'";
                SqlDataAdapter dSda = new SqlDataAdapter();
                dSda.SelectCommand = new SqlCommand(dCmd, nCon);
                DataTable dDt = new DataTable();
                dSda.Fill(dDt);
    
                for (int i = 0; i < dDt.Rows.Count; i++)
                {
                    Response.Write(dDt.Rows[i]["Distributor_ID"]);
                }
            }
        }
        catch (Exception e)
        {
            Response.Write(e.ToString());
        }
        finally { nCon.Close(); }
    }
    

    【讨论】:

    • 其实是一样的,所以请在第一个打开连接的命令中添加一个Reference id然后看... String cmd = "SELECT DISTINCT Refrence_ID FROM TableA";我想添加 WHERE Reference_ID = '0' (类似这样) String cmd = "SELECT DISTINCT Refrence_ID FROM TableA WHERE Reference_ID = '0'";它会给出 1 个值,而不是我想通过 Reference_Id 让整个 ID 相互获取
    • 您是否在您的应用程序中尝试过此解决方案?因为这将在循环中一一为您提供所有 Refrence_ID 的所有 ID。请更清楚地阐述您的问题。
    【解决方案3】:

    这是最简单的解决方案。但是考虑重构你的代码或考虑另一种方法,这不是perfomatic。还可以考虑在 sql 命令上使用参数。

                string initialId = Dt.Rows[0]["ID"].ToString();
                do
                {
                    string dCmd = "SELECT ID FROM TableA WHERE Reference_ID = '" + initialId + "'";
                    SqlDataAdapter dSda = new SqlDataAdapter();
                    dSda.SelectCommand = new SqlCommand(dCmd, nCon);
                    DataTable dDt = new DataTable();
    
                    dSda.Fill(dDt);
    
                    for (int i = 0; i < dDt.Rows.Count; i++)
                    {
                        initialId = dDt.Rows[i]["ID"];
                        Response.Write(dDt.Rows[i]["ID"]);
                    }
                }
                while(dDt.Rows.Count > 0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 2012-12-22
      • 2014-06-18
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多