C# 在调用"Fill"之前尚未初始化 SelectCommand 属性。在WinForm中



我正在尝试以编程方式使用数据库数据填充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并说:异常未处理的系统.无效操作异常:"在调用'Fill'之前,SelectCommand属性尚未初始化。

您使用了错误的 SqlAdapter。

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

SqlDataAdapter DaDavaoci = new SqlDataAdapter();

但是您没有传递命令文本和连接。

在底部,创建一个名为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-关键字,则您创建的 instace 将在 using-scope 结束后被释放。因此,要么使用use并在需要它们的地方创建新实例,要么使其成为类变量而不使用using(

尝试将这段代码修改为如下所示的内容:

string queryString = "SELECT * FROM Davaoci";
private DataSet PopuniDgDavaoci(DataSet ds, string connectionString, string queryString)
{
using (connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(queryString, connection);
adapter.Fill(ds);
}
return ds;
}

然后,可以将数据集附加到网格。

像这样:

MyGrid.DataSource = ds;

更多信息在这里: https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldataadapter?view=netframework-4.8

应该更正,因为sql命令中没有任何内容

using (connection = new SqlConnection(connectionString)) 
{
using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Davaoci",connection ))
{
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
DataTable table = new DataTable
{
Locale = CultureInfo.InvariantCulture
};
dataAdapter.Fill(table);
YourDataGridView.DataSource = table;
}
}

例如,请通过这个 如何:将数据绑定到 Windows 窗体 DataGridView 控件

这是我为解决我的问题所做的:

namespace UDDKT
{
public partial class Form2 : Form
{
DataSet ds = new DataSet();
SqlDataAdapter DaDavaoci = new SqlDataAdapter();
SqlDataAdapter DaAkcije = new SqlDataAdapter();
SqlConnection cs = new SqlConnection(@"Data Source=(LocalDB)MSSQLLocalDB;AttachDbFilename=|DataDirectory|UDDKT.mdf;Integrated Security=True");
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
SqlCommand SlctDavaoci = new SqlCommand("SELECT * FROM Davaoci", cs);
DaDavaoci.SelectCommand = SlctDavaoci;
DaDavaoci.Fill(ds, "TblDavaoci");
SqlCommand SlctAkcije = new SqlCommand("SELECT * FROM AkcijaDDK", cs);
DaAkcije.SelectCommand = SlctAkcije;
DaAkcije.Fill(ds, "TblAkcije");
DgDavaoci.DataSource = ds.Tables["TblDavaoci"];
DgAkcije.DataSource = ds.Tables["TblAkcije"];
}
}
}

最新更新