首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Dapper执行插入和更新

使用Dapper执行插入和更新
EN

Stack Overflow用户
提问于 2011-05-11 07:54:30
回答 5查看 270.3K关注 0票数 227

我对使用Dapper很感兴趣--但据我所知,它只支持查询和执行。我没有看到Dapper包含一种插入和更新对象的方法。

考虑到我们的项目(大多数项目?)需要做插入和更新,在dapper旁边做插入和更新的最佳实践是什么?

优选地,我们不必求助于参数构建的ADO.NET方法,等等。

在这一点上,我能想到的最好的答案是使用LinqToSQL进行插入和更新。有没有更好的答案?

EN

回答 5

Stack Overflow用户

发布于 2011-07-05 15:17:57

你可以这样做:

代码语言:javascript
复制
sqlConnection.Open();

string sqlQuery = "INSERT INTO [dbo].[Customer]([FirstName],[LastName],[Address],[City]) VALUES (@FirstName,@LastName,@Address,@City)";
sqlConnection.Execute(sqlQuery,
    new
    {
        customerEntity.FirstName,
        customerEntity.LastName,
        customerEntity.Address,
        customerEntity.City
    });

sqlConnection.Close();
票数 27
EN

Stack Overflow用户

发布于 2017-04-25 04:02:04

使用Dapper.Contrib就像这样简单:

插入列表:

代码语言:javascript
复制
public int Insert(IEnumerable<YourClass> yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Insert(yourClass) ;
    }
}

插入单个:

代码语言:javascript
复制
public int Insert(YourClass yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Insert(yourClass) ;
    }
}

更新列表:

代码语言:javascript
复制
public bool Update(IEnumerable<YourClass> yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Update(yourClass) ;
    }
}

更新单个:

代码语言:javascript
复制
public bool Update(YourClass yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Update(yourClass) ;
    }
}

来源:https://github.com/StackExchange/Dapper/tree/master/Dapper.Contrib

票数 23
EN

Stack Overflow用户

发布于 2020-07-06 13:48:36

与其使用任何第三方库进行查询操作,我宁愿建议您自己编写查询。因为使用任何其他第三方包都会失去使用dapper的主要优势,即编写查询的灵活性。

现在,为整个对象编写Insert或Update查询存在问题。为此,可以简单地创建助手,如下所示:

InsertQueryBuilder:

代码语言:javascript
复制
 public static string InsertQueryBuilder(IEnumerable < string > fields) {


  StringBuilder columns = new StringBuilder();
  StringBuilder values = new StringBuilder();


  foreach(string columnName in fields) {
   columns.Append($ "{columnName}, ");
   values.Append($ "@{columnName}, ");

  }
  string insertQuery = $ "({ columns.ToString().TrimEnd(',', ' ')}) VALUES ({ values.ToString().TrimEnd(',', ' ')}) ";

  return insertQuery;
 }

现在,只需传递要插入的列的名称,整个查询就会自动创建,如下所示:

代码语言:javascript
复制
List < string > columns = new List < string > {
 "UserName",
 "City"
}
//QueryBuilder is the class having the InsertQueryBuilder()
string insertQueryValues = QueryBuilderUtil.InsertQueryBuilder(columns);

string insertQuery = $ "INSERT INTO UserDetails {insertQueryValues} RETURNING UserId";

Guid insertedId = await _connection.ExecuteScalarAsync < Guid > (insertQuery, userObj);

您还可以通过传递TableName参数来修改函数以返回整个INSERT语句。

确保Class属性名称与数据库中的字段名称匹配。然后,只有你可以传递整个obj (就像我们例子中的userObj ),值将被自动映射。

同样,您也可以使用用于更新查询的helper函数:

代码语言:javascript
复制
  public static string UpdateQueryBuilder(List < string > fields) {
   StringBuilder updateQueryBuilder = new StringBuilder();

   foreach(string columnName in fields) {
    updateQueryBuilder.AppendFormat("{0}=@{0}, ", columnName);
   }
   return updateQueryBuilder.ToString().TrimEnd(',', ' ');
  }

并像这样使用它:

代码语言:javascript
复制
List < string > columns = new List < string > {
 "UserName",
 "City"
}
//QueryBuilder is the class having the UpdateQueryBuilder()
string updateQueryValues = QueryBuilderUtil.UpdateQueryBuilder(columns);

string updateQuery =  $"UPDATE UserDetails SET {updateQueryValues} WHERE UserId=@UserId";

await _connection.ExecuteAsync(updateQuery, userObj);

尽管在这些帮助器函数中,您还需要传递要插入或更新的字段的名称,但至少您可以完全控制查询,并且还可以在需要时包含不同的WHERE子句。

通过此辅助函数,您将保存以下代码行:

对于插入查询:

代码语言:javascript
复制
 $ "INSERT INTO UserDetails (UserName,City) VALUES (@UserName,@City) RETURNING UserId";

对于更新查询:

代码语言:javascript
复制
$"UPDATE UserDetails SET UserName=@UserName, City=@City WHERE UserId=@UserId";

似乎只有几行代码不同,但是当涉及到对具有10个以上字段的表执行插入或更新操作时,人们可以感觉到不同。

您可以使用nameof运算符在函数中传递字段名,以避免输入错误

而不是:

代码语言:javascript
复制
List < string > columns = new List < string > {
 "UserName",
 "City"
}

你可以这样写:

代码语言:javascript
复制
List < string > columns = new List < string > {
nameof(UserEntity.UserName),
nameof(UserEntity.City),
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5957774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档