我有下表
PNLParentId id operator
12 13 *
12 14 *
12 15 *
20 1 -
20 2 -
13 21 /
13 20 /我已经创建了一个foreach循环,在这个循环中,我获取了行并将另一个数据集添加到dataset.Then中,对于那些是children...but的数据集,现在如何链接它们??
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());
}
}
} 发布于 2014-04-14 14:32:09
这类问题通常最好在对象级别解决。例如,假设你有目标
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>();
}
}然后执行两个迭代-一个用于加载数据,一个用于分配父/子层次结构。
// 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);
}
}发布于 2014-04-14 13:31:15
可以使用@@SCOPE_IDENTITY()读取最后插入的标识值。只需在每个父母插入后阅读这些内容,并在插入孩子时使用它们。
但是,我没有看到您在代码中插入任何内容,所以这可能不是您要寻找的。如果你只对阅读现成的数据感兴趣,那么.
没有使用SqlCommand等的自动解决方案。简单的方法是使用例如字典来保存父项,并根据其父ID将子元素添加到这些项中。
或者您可以简单地切换到例如EntityFramework,让它为您完成以下工作:)
https://stackoverflow.com/questions/23060828
复制相似问题