ASP.NET Core Web API - 如何解决错误 CS1061“IDbConnection”不包含“OpenAsync”的定义

问题描述 投票:0回答:1

在 ASP.NET Core-6 中,我将 Dapper 与 SqlConnection 结合使用

主要代码:

using System.Data;
using System.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Dapper;

public class UserRepository
{
    private readonly IConfiguration _configuration;
    private readonly ILogger<UserRepository> _logger;

    public NIPSenderRepository(IConfiguration configuration, ILogger<UserRepository> logger)
    {
        _configuration = configuration;
        _logger = logger;
    }

    private IDbConnection HrmConnection
    {
        get { return new SqlConnection(_configuration.GetConnectionString("HrmConnection")); }
    }

    public async Task UpdateTransactionStatusAsFailed(long payment_id)
    {
        StringBuilder sb = new StringBuilder();
        IDbConnection _dbConnection = null;
        try
        {      
            _dbConnection = HrmConnection; // Assign the connection here
            if (_dbConnection.State == ConnectionState.Closed)
            {
                await _dbConnection.OpenAsync();
            }
            string query = "UPDATE pmt_payments SET icount=ISNULL(icount, 0) + 1, processed_dt=GETDATE(), ptystatus='failed' WHERE payment_id = @payment_id";
            await _dbConnection.ExecuteAsync(query, new { payment_id });
        }
        catch (Exception ex)
        {
            sb.Append("\n Error Update transaction with payment_id: ").Append(payment_id).Append(" \n");
            sb.Append("\n ==================================== \n");
            sb.Append(ex.Message);
            sb.Append("\n ==================================== \n");
            _logger.LogError(sb.ToString());
        }
        finally
        {
            // Check if the connection is not null before trying to close it
            if (_dbConnection != null && _dbConnection.State != ConnectionState.Closed)
            {
                _dbConnection.Close();
            }
        }
    }
}

我收到此错误:

错误 CS1061“IDbConnection”不包含“OpenAsync”的定义,并且找不到接受“IDbConnection”类型的第一个参数的可访问扩展方法“OpenAsync”(您是否缺少 using 指令或程序集引用?)

可能出了什么问题?

请用完整代码帮忙解决

c# asp.net-core dapper
1个回答
0
投票

我将重写代码如下。

在我看来,

HrmConnection
属性看起来毫无用处。我把它收了起来。相反,直接在需要的地方创建
SqlConnection
对象。

连接字符串直接在构造函数中从

IConfiguration
获取,并存储在字段中以供将来使用。
同时,
IConfiguration
没有在其他地方使用,所以我们不存储它。

using 语句会自动释放资源,即使出现异常也是如此。

public class UserRepository
{    
    private readonly ILogger<UserRepository> _logger;
    private readonly string _connectionString;

    public NIPSenderRepository(IConfiguration configuration, ILogger<UserRepository> logger)
    { 
        _logger = logger;
        _connectionString = configuration.GetConnectionString("HrmConnection");
    }

    public async Task UpdateTransactionStatusAsFailed(long payment_id)
    {        
        try
        {
            using var connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();            
            string query = "UPDATE pmt_payments SET icount=ISNULL(icount, 0) + 1, processed_dt=GETDATE(), ptystatus='failed' WHERE payment_id = @payment_id";
            await connection.ExecuteAsync(query, new { payment_id });
        }
        catch (Exception ex)
        {
            var sb = new StringBuilder()
                .Append("\n Error Update transaction with payment_id: ")
                .Append(payment_id)
                .Append(" \n")
                .Append("\n ==================================== \n")
                .Append(ex.Message)
                .Append("\n ==================================== \n");

            _logger.LogError(sb.ToString());
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.