【问题标题】:Insert recursive/nested Object in recursive table在递归表中插入递归/嵌套对象
【发布时间】:2015-10-22 02:03:58
【问题描述】:

使用 microsoft sql server 假设以下示例表具有递归关系

[dbo].[IPAddress]
(
    [IPAddressID] [int] PRIMARY KEY IDENTITY(1,1),
    [IP] [nchar] (15),
    [ParentID] [int] FOREIGN KEY REFERENCES [IPAddressID]
)

我有以下嵌套对象,其中包含相同类型对象的列表

public class IPAddress
{
    public int IPAddressID { get; set; }
    public string IP { get; set; }
    public IPAddress[] Childs { get; set; }
}

var IP = new IPAddress
{
    IP = "10.0.0.0",
    Childs = new IPAddress[]
    {
        new IPAddress
        {
            IP="10.1.0.0",
            Childs = new IPAddress[]
            {
                new IPAddress{ IP="10.1.1.0" },
                new IPAddress{ IP="10.1.2.0" },
                new IPAddress{ IP="10.1.3.0" }
            }
        }
    }
};

插入该对象时,表格数据应该是这样的:

IPAddressID,IP,ParentID
10,'10.0.0.0',Null
12,'10.1.0.0',10
13,'10.1.1.0',12
14,'10.1.2.0',12
15,'10.1.3.0',12

在我的真实情况下,基础对象可能有 60 个子对象作为第二级,第二级中的每个子级在第三级有 4 个子级,那么平面对象计数为 1 + 60 + (60*4) = 2461 个对象/行和对象有 25 个属性映射到继承表层次结构中的 25 个列,那么使用 c# ado.net 将该对象插入表的最佳方法是什么?我可以用 cte 吗?

【问题讨论】:

    标签: c# .net sql-server recursion ado.net


    【解决方案1】:

    这是一种方法。您可以尝试通过传递您的 IPAddress 对象来调用此方法。您可以使用所有查询构建一个插入字符串,如果您想提高效率,只需调用一次ExecuteNonQuery。请注意,每个查询有 1000 个插入限制。

    public void InsertIpAdress(IPAddress myipaddress)
    {
    string cs = "Put your connection string"
    SqlConnection cn = new SqlConnection(cs);
    
    try
    {
        //Open connection
        cn.Open();
    
        //First we insert the parent(Use stored procedure provided if you want)
        SqlCommand cm = new SqlCommand("[dbo].[AddParent]", cn);
        cm.CommandType = CommandType.StoredProcedure;
    
        //Add parameter
        cm.Parameters.AddWithValue("@IP", myipaddress.IP);
    
        //Output parameter
        SqlParameter output = new SqlParameter("@Parent",SqlDbType.Int);
        output.Direction = ParameterDirection.Output;
        cm.Parameters.Add(output);
    
        //Execute query
        cm.ExecuteNonQuery();
    
        //Here we get parent id
        int parent = Convert.ToInt32(output.Value.ToString());
    
        //Then we have to add every children
        cm = new SqlCommand("INSERT INTO YourTable (IP,ParentID) VALUES (@ip,@parent);", cn);
    
        //Add parent as parameter 
        cm.Parameters.AddWithValue("@parent", parent);
    
        foreach(IPAddress element in myipaddress.Childs)
        {
            //Add the current child ip
            cm.Parameters.AddWithValue("@ip", element.IP);
    
            //Execute command
            cm.ExecuteNonQuery();
        }
        //Close connection
        cn.Close();
    }
    catch(Exception ex)
    {
        //You can handle exceptions here
        MessageBox.Show(ex.message);
    }
    }
    

    这就是存储过程的样子

    ALTER PROCEDURE [dbo].[AddParent]
        @IP          NVARCHAR(50),
        @Parent      INT OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
    
        INSERT INTO YourTable (IP,ParentID) VALUES (IP,null);
        SET @Parent = SCOPE_IDENTITY();
    END;
    

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 2019-09-15
      • 1970-01-01
      • 2021-04-21
      相关资源
      最近更新 更多