You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ADO.NET仓储模式连接数据库失败,但EF Core直接查询正常

问题:ADO.NET调用存储过程时SQL用户登录失败

连接字符串

Server=tcp:mydbserverURL,1433;Initial Catalog=mydb;Persist Security Info=False;User ID=sqluser;Password=mypassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;

数据访问情况

  • EF Core + Automapper:使用生成的DBContext.cs,运行正常
  • ADO.NET仓储模式访问存储过程:无法运行,报错**“sqluser/sqladmin登录失败”**

已尝试的无效解决方法

  • 修改连接字符串:
    • 添加Integrated Security=False:无效
    • 添加Trusted_Connection=True:无效
  • 使用相同连接字符串连接另一个无VNET集成的数据库:无效
  • 创建新的SQL用户:无效

报错的ADO.NET代码片段

public DataTable GetDataByStoredProc(string storedProcName, IEnumerable<KeyValuePair<string, object>> parameters)
{
    var connectionString = _dbContext.Database.GetDbConnection().ConnectionString;
    DataTable dt = new DataTable();
    try
    {
        using (SqlConnection sqlConnection = new SqlConnection(connectionString))
        {
            sqlConnection.Open(); // 此处触发报错
            using (SqlCommand sqlCommand = new SqlCommand(storedProcName, sqlConnection))
            {
                SqlDataAdapter adapt = new SqlDataAdapter(sqlCommand);
                adapt.SelectCommand.CommandType = CommandType.StoredProcedure;

                if (parameters != null)
                {
                    foreach (var parameter in parameters)
                    {
                        adapt.SelectCommand.Parameters.Add(new SqlParameter(parameter.Key, parameter.Value));
                    }
                }

                adapt.Fill(dt);
            }
        }
        return dt;
    }
    catch (SqlException ex)
    {
        throw;
    }
}

错误信息

用户SQLUser登录失败


排查方向

  1. 确认连接字符串的实际值:EF Core运行时可能会重载或加密连接字符串,不要直接从_dbContext.Database.GetDbConnection().ConnectionString获取,改用和EF Core一致的配置源(比如appsettings.json)读取原始连接字符串测试。
  2. 检查存储过程权限:确保SQL用户sqluser对目标存储过程拥有EXECUTE权限,同时对存储过程涉及的表有必要的读写权限——EF Core正常运行不代表存储过程的权限已配置。
  3. 验证SQL登录映射:确认数据库用户sqluser已正确映射到SQL Server实例的登录名,且该登录未被禁用。
  4. 捕获完整错误详情:在catch块中输出ex.ToString(),获取错误子状态码(比如18456的细分码),子状态码能精准定位原因(如密码错误、用户不存在、权限不足等)。
  5. 核对用户名大小写:部分SQL Server环境对用户名大小写敏感,确认代码中使用的用户名和数据库中创建的完全一致。

内容的提问来源于stack exchange,提问作者DL Narasimhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:45:34