繁体   English   中英

C#以List作为参数插入到SQL表中

[英]C# Insert into SQL Table with List as parameter

在这个精彩论坛的专家的真诚帮助下,我已经能够解析由SharePoint列表返回的我的xml,以将所需的列表项目转换为C#列表。

XDocument xdoc = XDocument.Parse(activeItemData.InnerXml);
XNamespace z = "#RowsetSchema";

List<int> listID = (from row in xdoc.Descendants(z + "row") 
select (int)row.Attribute("ows_ID")).ToList();

List<string> listTitle = (from row in xdoc.Descendants(z + "row") 
select (string)row.Attribute("ows_LinkTitle")).ToList();

我创建了一个SQL表,我想使用Lists listID和listTitle作为参数在我的表中插入值

System.Data.SqlClient.SqlConnection sqlConnection1 =
            new System.Data.SqlClient.SqlConnection(MyconnectionString);

            System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
            cmd.CommandType = System.Data.CommandType.Text;
            cmd.CommandText = "INSERT TechOpsProjectTracker (ID, [Project Name]) VALUES (@ID, @ProjectName)";

//What I want to do:
            //1. @ID should get the values from the List listID: List<int> listID = (from row in xdoc.Descendants(z + "row") select (int)row.Attribute("ows_ID")).ToList();
            //2. @ProjectName should get the values from the List listTitle: List<string> listTitle = (from row in xdoc.Descendants(z + "row") select (string)row.Attribute("ows_LinkTitle")).ToList();
            //3. so each new record inserted in the table has ID and its corresponding Project Name. Something like this
            /* ID    Project Name
               360   GEI Survey data to Sharepoint
               378   Create back end and environment to support User demographic reporting


             */

可能还有其他一些可能更容易完成工作的方法。 请告诉我。 TIA。

在将列表作为参数插入时,您可以尝试使用表值参数。 它类似于批量插入或使用临时表来执行SELECT INTO。

http://msdn.microsoft.com/en-us/library/bb675163.aspx

如何将表值参数从.net代码传递给存储过程

设置类似于的用户定义类型。

CREATE TYPE [dbo].[tableOf_Ints] AS TABLE(
    [ID] [int] NULL
)
GO

然后你可以像这样使用它。

public static SqlCommand CreateCommand(List<int> ints)
{
    var dt = new DataTable();
    dt.Columns.Add("ID",typeof(Int32));
    for (int i = 0; i < ints.Count; i++)
    {
        dt.Rows.Add(ints[i]);
    }

    SqlCommand cmd = new SqlCommand("SomeStoredProc");
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandTimeout = 120;
    var param1 = cmd.Parameters.AddWithValue("@SomeParam", dt);
    param1.SqlDbType = SqlDbType.Structured;
    param1.TypeName = "dbo.tableOf_Ints";

    return cmd;
}

假设你有这样的存储过程。

CREATE PROCEDURE [dbo].[SomeStoredProc]  
    @SomeParam TableOf_Ints READONLY
AS
BEGIN
END

如果您使用的是Sql Server 2008,则可以将表传递给存储过程并执行基于集的更新/插入。 这消除了您添加的许多复杂性。

http://msdn.microsoft.com/en-us/library/bb510489.aspxAdo.Net Link

cmd.CommandText = "INSERT TechOpsProjectTracker (ID, [Project Name]) VALUES (@ID, @ProjectName)";    
Dictionary<int, string> dt = new Dictionary();
    for (int i=0; i<ListId.Count; i++)
    {
    dt.Add(ListID[i], ListTitle[i]);
    }

    foreach (KeyValuePair<int, string> pair in dt)
    {
       SqlParameter a = cmd.Parameters.Add("@ID", SqlDbType.Int);

       // or write what is the type of your column in your table after SqlDbType. 

       a.Value = pair.key;

       SqlParameter b = cmd.Parameters.Add("@Project", SqlDbType.Varchar, 50);

        // 50 is what you gave max length to your db column//

        b.Value = pair.value;

        int v = cmd.ExecuteNonQuery();

        if ( v == 1 )
        {
           MessageBox.Show("Successfully Done !");
        }

        else
        {
           MessageBox.Show("Oops ! I can' t insert Successfully")
        }
    }

或者直接通过AddinParameter func或AddwithValue函数将ListID [0]传递给查询文本

cmd.CommandText = "INSERT TechOpsProjectTracker (ID, [Project Name]) VALUES (@ID, @ProjectName)";

 for (int i=0; i<ListId.Count; i++)
    {
       cmd.Parameters.AddWithValue("@ID", ListID[i]);
       cmd.Parameters.AddWithValue("@Project", ListTitle[i]);
       int result = cmd.ExecuteNonQuery();

       // if you want you can add here the messagebox as the same in first code example
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM