跨类调用方法存疑,数据库读取整数报错:Connection未初始化
问题解决与代码修复
一、数据库报错原因及修复
你遇到的错误:
System.InvalidOperationException: 'ExecuteReader: 连接属性尚未初始化。'
核心问题出在Database类的compare方法里:
- 直接
new SqlCommand()创建的命令没有关联任何数据库连接,也未指定要执行的SQL语句,调用ExecuteReader自然会报错。 - 数据库连接长期保持打开状态,容易引发连接泄漏,不符合ADO.NET最佳实践。
修复后的Database类代码
class Database { // 替换为你的实际数据库连接字符串 private readonly string _connectionString = "你的数据库连接字符串"; private SqlConnection _sqlConnection; public Database() { _sqlConnection = new SqlConnection(_connectionString); } public SqlCommand CreateCommand(string sql) { var cmd = _sqlConnection.CreateCommand(); cmd.CommandText = sql; return cmd; } public int Compare() { int id = 0; // 使用using语句确保资源自动释放 using (var cmd = CreateCommand("SELECT TOP 1 ID FROM 你的表名")) // 替换为实际查询SQL { try { _sqlConnection.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.Read()) // 先判断是否有数据,避免空读取报错 { id = dr.GetInt32(0); } } } finally { // 无论是否报错,都关闭连接 if (_sqlConnection.State == System.Data.ConnectionState.Open) { _sqlConnection.Close(); } } } return id; } public void ExecuteSql(string sql) { using (var cmd = CreateCommand(sql)) { try { _sqlConnection.Open(); cmd.ExecuteNonQuery(); } finally { if (_sqlConnection.State == System.Data.ConnectionState.Open) { _sqlConnection.Close(); } } } } }
关键修改点说明
- 关联命令与连接:通过
CreateCommand方法创建的命令已绑定数据库连接,避免手动创建无关联的SqlCommand。 - 补充SQL语句:查询时必须指定具体SQL,比如
SELECT TOP 1 ID FROM 你的表名,替换为实际要查询的表和字段。 - 资源自动释放:用
using包裹SqlCommand和SqlDataReader,确保使用后自动释放资源;在finally块中关闭连接,防止连接泄漏。 - 空数据判断:读取前先判断
dr.Read()返回值,避免数据库无数据时读取报错。
二、跨类调用方法的正确方式
你当前在FmLogin类中调用Database方法的方式是正确的:
- 实例化目标类对象:
Database database = new Database(); - 通过实例对象调用public修饰的方法:
int holder = database.Compare();
如果需要更灵活的调用,还可以:
- 将
Database类的方法设为静态方法,直接通过类名调用(但数据库连接不适合静态,多线程场景易出问题)。 - 通过构造函数注入或依赖注入传递
Database实例,适合复杂项目解耦。
修复后的FmLogin类代码
public partial class FmLogin : Form { private readonly Database _database; public FmLogin() { InitializeComponent(); _database = new Database(); } private void button2_Click(object sender, EventArgs e) { int holder = _database.Compare(); if (holder > 0) { MessageBox.Show("2", "Thank you for making an account!", MessageBoxButtons.OK); } } }
内容的提问来源于stack exchange,提问作者contingiouscrayon
相关产品推荐
相关产品推荐

