首页 > 解决方案 > C# SelectCommand 属性在调用“填充”之前尚未初始化。在 WinForm 中

问题描述

我正在尝试使用 DB 数据以编程方式在我的 Windows 窗体中填充 DataGridView,但我显然做错了。

namespace UDDKT
{
    public partial class Form2 : Form
    {
        SqlConnection connection;
        string connectionString;

        DataSet ds = new DataSet();
        SqlDataAdapter DaDavaoci = new SqlDataAdapter();
        SqlDataAdapter DaAkcije = new SqlDataAdapter();

        public Form2()
        {
            InitializeComponent();

            connectionString = ConfigurationManager.ConnectionStrings["UDDKT.Properties.Settings.UDDKTConnectionString"].ConnectionString;
        }

        public SqlCommand SlctDavaoci { get; private set; }

        private void Form2_Load(object sender, EventArgs e)
        {
            PopuniDgDavaoci();
        }

        private void PopuniDgDavaoci()
        {
            using (connection = new SqlConnection(connectionString))
            using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Davaoci", connection))
            {
                DaDavaoci.SelectCommand = SlctDavaoci;
                DaDavaoci.Fill(ds, "TblDavaoci");
            }
        }
    }
}

当我尝试运行它时,它会突出显示 DaDavaoci 并说: Exception Unhandled System.InvalidOperationException: '在调用 'Fill' 之前尚未初始化 SelectCommand 属性。

标签: c#visual-studiowinforms

解决方案


您使用了错误的 SqlAdapter。

在顶部创建一个名为的适配器DaDavoci

SqlDataAdapter DaDavaoci = new SqlDataAdapter();

但是您没有传递 CommandText 也没有传递 Connection。

在底部创建一个名为adapter(带有连接和命令文本)的新适配器。但是随后您再次从顶部使用适配器,它仍然没有命令文本,也没有连接。

using (connection = new SqlConnection(connectionString))
using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Davaoci", connection))
{
    DaDavaoci.SelectCommand = SlctDavaoci;
    DaDavaoci.Fill(ds, "TblDavaoci");
}

您应该使用您创建的适配器,其中包含一个命令文本和一个像这样的连接

using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Davaoci", connection))
{
    adapter.SelectCommand = SlctDavaoci;
    adapter.Fill(ds, "TblDavaoci");
}

我不确切知道您要做什么,但我认为代码顶部的两个适配器的初始化没有意义(至少对我而言)。我不会将连接或适配器存储在类变量中,而是在需要时创建新的。(如果您使用 using-keyword,您创建的实例将在 using-scope 结束后被释放。因此,要么使用 using 并在需要它们的地方创建新实例,要么使其成为类变量而不使用 using)


推荐阅读