1

我对 C# 和 Dapper 还很陌生。我正在尝试为我的项目编写一个通用的插入数据方法。我来自 Delphi 环境,所以我仍然在 C# 中寻找方法。

Dapper 似乎使用起来相当简单,但我遇到了一些挑战。我已经尝试了使用以下代码正确获取语法的所有方法,但均未成功。

问题似乎与T相关(我仍然完全不明白T是什么)并且我尝试过的所有组合都不起作用。

public async Task<int> InsertData<T>(T list)
{
    string connectionString = _config.GetConnectionString(ConnectionStringName);

    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return await connection.InsertAsync<int>(list);
    }
}

以下代码确实有效,那么我哪里出错了?

public async Task SaveData<T>(string sql, T parameters)
{
    string connectionString = _config.GetConnectionString(ConnectionStringName);

    using (IDbConnection connection = new SqlConnection(connectionString))
    {
            await connection.ExecuteAsync(sql, parameters);
    }
}
4

1 回答 1

1

您的第二个代码 ( await connection.ExecuteAsync(sql, parameters);) 有效,因为您只是在执行您手写的 SQL 语句。该方法ExecuteAsync属于Dapper;不是 Dapper.Contrib。泛型T用于parameters,而不是用于您尝试插入的对象。

使用您的第一个代码 ( return await connection.InsertAsync<int>(list);),您实际上是在使用 Dapper.Contrib;您不是手动编写 SQL 语句。Dapper.Contrib 为您生成它。

您的以下代码似乎是问题所在:

return await connection.InsertAsync<int>(list);

您将泛型参数传递<int>给没有意义的方法。

我没有对此进行测试,但我希望将该行更改为以下行应该可以工作:

return await connection.InsertAsync<T>(list);

此外,您必须通过添加来确保泛型类型T是类 where T : class

以下通用方法应该符合您的目的;您需要将其转换async为与您当前的代码匹配:

public void InsertData<T>(T entity) where T : class
{
    string connectionString = ....;

    using(IDbConnection connection = new SqlConnection(connectionString))
    {
        long result = connection.Insert<T>(entity);
    }
}

我不了解您代码中的其他部分。说InsertData<T>(T list)。是什么list?它是单个对象还是对象列表?如果它是对象列表,List<T> list则更有意义。如果它是单个对象,最好重命名list为实际对象名称,例如T customer/entity/poco等等。

于 2021-07-21T09:14:11.680 回答