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

