Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何链接父ID和子ID?_C#_Sql - Fatal编程技术网

C# 如何链接父ID和子ID?

C# 如何链接父ID和子ID?,c#,sql,C#,Sql,我有下表 PNLParentId id operator 12 13 * 12 14 * 12 15 * 20 1 - 20 2 - 13 21 / 13 20 / 我已经创建了一个foreach循环,从中获取行并添

我有下表

PNLParentId  id         operator 

12           13         *
12           14         *
12           15         *

20           1          -
20           2          -

13           21         /
13           20         /
我已经创建了一个
foreach
循环,从中获取行并添加到数据集。然后是另一个数据集,用于子数据集…但我现在不知道如何链接它们

String dbConnection = "Data Source=test;Initial Catalog=test;Integrated Security=SSPI;";
String myCommand = "SELECT PNLParentId , Operator FROM [test].[dbo].[DimPNL] GROUP BY PNLParentId,Operator";

DataSet ds = GetDataSet(myCommand, dbConnection);
using (SqlConnection connection = new SqlConnection(dbConnection))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand(myCommand, connection))
    {
        DataSet ds1 = new DataSet();
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(command);
        da.Fill(ds1, "test");
        dt = ds1.Tables["test"];

        foreach (DataRow dr in dt.Rows)
        {
            using (SqlCommand command1 = new SqlCommand("SELECT PNLId FROM [test].[dbo].[DimPNL]  WHERE @PNLParentId =PNLParentId and @Operator=Operator" , connection))
            {
                command1.Parameters.Add(
                    new SqlParameter(
                        "@PNLParentId", dr["PNLParentId"].ToString()));

                command1.Parameters.Add(
                    new SqlParameter(
                        "@Operator", dr["Operator"].ToString()));

                DataSet ds2 = new DataSet();
                DataTable dt1 = new DataTable();
                SqlDataAdapter da1 = new SqlDataAdapter(command1);
                da1.Fill(ds2, "test1");
                dt1 = ds2.Tables["test1"];

                foreach (DataRow dr1 in dt1.Rows)
                {
                    Console.WriteLine(dr1["PNLId"].ToString());
                }
            }
        } 

您可以使用
@@SCOPE\u IDENTITY()
读取上次插入的标识值。只要在每次插入父对象后阅读,并在插入子对象时使用这些内容即可

但是,我没有看到您在代码中插入任何内容,因此这可能不是您想要的。如果你只对阅读现成的数据感兴趣,那么

仅使用
SqlCommand
等并没有自动解决方案。简单的方法是使用字典来保存父项,并根据父项ID将子项添加到父项中


或者您可以简单地切换到EntityFramework,让它为您完成工作:)

这种问题通常最好在对象级别解决。例如,假设你有一个物体

class Node {
  public int Id { get; set; }
  public int? ParentId { get; set; }
  public string Operator { get; set; }
  public Node Parent { get; set; }
  public IList<Node> Children { get; set; }
  public Node() {
    Children = new List<Node>();
  }
}
类节点{
公共int Id{get;set;}
public int?ParentId{get;set;}
公共字符串运算符{get;set;}
公共节点父节点{get;set;}
公共IList子项{get;set;}
公共节点(){
Children=新列表();
}
}
然后,您将进行两次迭代—一次用于加载数据,一次用于分配父/子层次结构

  // dt1 is something with all rows with columns Id, ParentId, Operator together
  DataTable dt1 = null;

  var map = new Dictionary<int, Node>();
  var rootNodes = new List<Node>();
  foreach(DataRow row in dt1.Rows) {
    int id = Convert.ToInt32(row["Id"]);
    int? parentId = null;
    if (!row.IsNull("ParentId")) {
      parentId = Convert.ToInt32(row["ParentId"]);
    }
    string op = Convert.ToString(row["Operator"]);
    map[id] = new Node {
      Id = id,
      ParentId = parentId,
      Operator = op
    };
  }
  foreach (var pair in map) {
    if (pair.Value.ParentId.HasValue) {
      var parent = map[pair.Value.ParentId.Value];
      pair.Value.Parent = parent;
      parent.Children.Add(pair.Value);
    } else {
      rootNodes.Add(pair.Value);
    }
  }
//dt1是一种将列Id、ParentId、Operator的所有行放在一起的东西
数据表dt1=null;
var map=newdictionary();
var rootNodes=新列表();
foreach(dt1.Rows中的数据行){
intid=Convert.ToInt32(第[“id”行]);
int?parentId=null;
如果(!row.IsNull(“ParentId”)){
parentId=Convert.ToInt32(第[“parentId”]行);
}
字符串op=Convert.ToString(行[“运算符”]);
map[id]=新节点{
Id=Id,
ParentId=ParentId,
操作员=op
};
}
foreach(映射中的变量对){
if(pair.Value.ParentId.HasValue){
var parent=map[pair.Value.ParentId.Value];
pair.Value.Parent=父项;
parent.Children.Add(pair.Value);
}否则{
rootNodes.Add(pair.Value);
}
}

您想要什么样的链接?我实际上没有看到任何向列表中添加项的代码。你能把代码也包括进来吗?@CoderDennis我更新了我的问题。我不会使用两个数据集??