【问题标题】:Loop structure to perist data using addwithValue使用 addwithValue 保存数据的循环结构
【发布时间】:2010-07-04 10:43:14
【问题描述】:

我的 LINQ 知识还可以。我需要一个循环或其他方法来完成 ADO.NET 方法(请参阅foreach 循环)

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-to-SQL 吗?

你能给出清晰的样本吗

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

【问题讨论】:

  • 你能解释一下你实际上想用这段代码做什么吗?您是在尝试向数据库中插入新行,还是更新现有行?
  • 是的,我尝试在 linqtoSql 中使用 AddwithValue 方法添加新行?

标签: c# .net linq linq-to-sql


【解决方案1】:

Linq to SQL 将数据类(通常称为“实体”)映射到 SQL 数据库表。

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

您通常在 Visual Studio 的 Linq to SQL 设计器 UI 中定义此映射。此 UI 可让您直观地编辑 .dbml 文件,并从本质上定义 CLR 实体对象与支持 SQL 数据库表之间的映射。

See this MSDN article 获取如何添加新 Linq to 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 实体,而不是直接在当​​前生成的代码中使用实体对象这些键/值对。

【讨论】:

  • 我们可以这样做吗? using (var myEntity = new EntityObject()) foreach (ld.Keys 中的字符串 ky) { myEntity .Parameters.AddWithValue(ky, ld[ky]);我需要它,我不想写列 a ,b,c,d,...。 ... z
  • 我已经更新了答案,展示了如何使用反射来实现这一点。但是,我认为您应该重新考虑为什么要在方法之间传递键/值对数组,而不是直接传递 LINQ->SQL 实体对象。
  • 非常感谢我会成功的。比我发布的结果太多了
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多