循环结构使用addwithValue验证数据

问题描述:

我的LINQ知识还可以。我需要一个循环或完成ADO.NET方法,另一种方法(见foreach循环)循环结构使用addwithValue验证数据

public bool AccessProcess(string sp, ListDictionary ld, CommandType cmdType) 
{ 
    SqlConnection con = new SqlConnection(
     WebConfigurationManager.ConnectionStrings["conn"].ToString()); 
    SqlCommand cmd = new SqlCommand(sp, con); 
    try 
    { 
     con.Open(); 
     cmd.CommandType = cmdType; 
     foreach (string ky in ld.Keys) 
     { 
      cmd.Parameters.AddWithValue(ky, ld[ky]); 
     } 
     cmd.ExecuteNonQuery(); 
    } 
    finally 
    { 
     con.Dispose(); 
     cmd.Dispose(); 
    } 
    return true; 
} 

我需要:

foreach (string ky in ld.Keys) 
    yourObject.SetPropertyValue(ky, ld[ky]); 

我怎么能这样做?我可以使用LINQ到SQL吗?

你能到SQL地图数据类(通常称为“实体”),以一个SQL数据库表给出明确的样品一样

using (var contex = new DataclassContext()) 
foreach (string ky in ld.Keys) 
{ 
    contex.Parameters.AddWithValue(ky, ld[ky]); 
} 
contex.SubmitChanges(); 
+0

你能解释一下你实际上想要用这个代码吗?您是否试图向数据库中插入新行,或更新现有行? – Sam 2010-07-04 11:38:21

+0

是的,我尝试在linqtoSql中使用AddwithValue方法添加新行? – Penguen 2010-07-04 12:01:25

Linq的。

因此,首先您需要使用Linq-> SQL设计器为您生成这些数据类,以及一个DataContext对象,它将这些类映射到数据库以及从数据库映射这些类。

您通常在Visual Studio中的Linq to SQL设计器UI中定义此映射。这个UI让你直观地编辑一个.dbml文件,从本质上定义你的CLR实体对象和后备SQL数据库表之间的映射。

See this MSDN article有关如何将新的Linq添加到SQL类的示例。

一旦你定义了这个类,你可以创建这个类的新实例及其属性值。这些属性值被映射到SQL数据库表中的列。然后将该对象传递给由LINQ to SQL生成的DataContext类,以向数据库中的表添加新行。

所以,你会做这样的事情:

For a database table with columns "ColumnA", "ColumnB" and "ColumnC" 

var myEntity = new EntityObject { ColumnA = "valueA", ColumnB = "valueB", "ColumnC" = "valueC" }; 
DataContext.InsertOnSubmit(myEntity); 
DataContext.SubmitChanges(); 

这将插入新行与指定的列值的数据库。

现在,如果你不想手动编写代码来写ColumnA,ColumnB,等等,那么你可以使用反射来写对实体相应的属性:

例如,实体实例“ myEntity所“:

var properties = myEntity.GetType().GetProperties(); 

foreach (string ky in ld.Keys) 
{ 
    var matchingProperty = properties.Where(p => p.Name.Equals(ky)).FirstOrDefault(); 
    if (matchingProperty != null) 
    { 
     matchingProperty.SetValue(myEntity, ld[ky], null); 
    } 
} 

使用反射不给最好的表现,所以我会问,为什么你甚至想键和值的数组映射到linq-> SQL实体,而不是使用实体对象直接在当前生成这些键/值对的代码中。

+0

我们可以做到吗? (var myEntity = new EntityObject()) foreach(ld.Keys中的字符串ky) { myEntity .Parameters.AddWithValue(ky,ld [ky]); } 我nee它,我不想写列a,b,c,d,..。 ..。 z – Penguen 2010-07-04 12:35:54

+0

我已经更新了答案,显示了如何使用反射来实现此目的。然而,我认为你应该重新思考为什么你要在你的方法之间传递一组键/值对,而不是直接传递LINQ-> SQL实体对象。 – Sam 2010-07-04 12:49:11

+0

沙克斯很多我会做到这一点。比我发布结果thaks toooo多 – Penguen 2010-07-04 12:56:58