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

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

XDocument xdoc = XDocument.Parse(activeItemData.InnerXml); XNamespace z = "#RowsetSchema"; List listID = (from row in xdoc.Descendants(z + "row") select (int)row.Attribute("ows_ID")).ToList(); List 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 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 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。

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

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

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

 public static SqlCommand CreateCommand(List 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 

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

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

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

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

http://msdn.microsoft.com/en-us/library/bb510489.aspx和Ado.Net Link

 cmd.CommandText = "INSERT TechOpsProjectTracker (ID, [Project Name]) VALUES (@ID, @ProjectName)"; Dictionary dt = new Dictionary(); for (int i=0; i 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