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

跨类调用方法存疑,数据库读取整数报错: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();
                }
            }
        }
    }
}

关键修改点说明

  1. 关联命令与连接:通过CreateCommand方法创建的命令已绑定数据库连接,避免手动创建无关联的SqlCommand。
  2. 补充SQL语句:查询时必须指定具体SQL,比如SELECT TOP 1 ID FROM 你的表名,替换为实际要查询的表和字段。
  3. 资源自动释放:用using包裹SqlCommand和SqlDataReader,确保使用后自动释放资源;在finally块中关闭连接,防止连接泄漏。
  4. 空数据判断:读取前先判断dr.Read()返回值,避免数据库无数据时读取报错。

二、跨类调用方法的正确方式

你当前在FmLogin类中调用Database方法的方式是正确的:

  1. 实例化目标类对象:Database database = new Database();
  2. 通过实例对象调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:13:13