在这个精彩论坛的专家的真诚帮助下,我已经能够解析由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。
答案 0 :(得分:2)
在插入列表作为参数时,您可以尝试使用表值参数。它类似于批量插入或使用临时表来执行SELECT INTO。
http://msdn.microsoft.com/en-us/library/bb675163.aspx
How to pass table value parameters to stored procedure from .net code
答案 1 :(得分:2)
设置类似于。
的用户定义类型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
答案 2 :(得分:0)
如果您使用的是Sql Server 2008,则可以将表传递给存储过程并执行基于集的更新/插入。这消除了您添加的许多复杂性。
http://msdn.microsoft.com/en-us/library/bb510489.aspx 和Ado.Net Link
答案 3 :(得分:0)
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
}