我正在尝试以编程方式使用数据库数据填充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"];
}
}
}