我正在尝试用 C# 创建一个 Windows 窗体应用程序,主要是为了练习我在大学里学到的东西。我的数据库是由三个表(SetIndex、SetSong [连接表] 和 Song)组成的 Access 数据库。我们从未学会如何在应用程序中使用数据库,只是在网站中。我学到的大部分东西,都是通过反复试验学到的。
我有一个组合框列表,其中包含来自 SetIndex 表的日期,值是 ID(SetIndex 的主键)。我需要能够使用选择语句查询数据库,该语句说 setindex.id = setsong.setid 和 setsong.songid = song.id 和 setIndex.id = 一个变量,从下拉列表中选择的值。我使用 (setindex.id = ?) 在 Access 中编写了一个 select 语句,该语句在 Access 中运行良好,但我还没有弄清楚如何在 C# 中执行它。我找到了有关如何使用参数以及如何查询多个表的答案,但没有找到将两者结合起来的答案。
那么有没有办法在代码中做到这一点?
这是我尝试的最后一件事:
using (OleDbConnection dataConnection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Mandy\Documents\Visual Studio 2010\Projects\SetManager1.3\SetManager1.3\SetManager.accdb"))
{
using (OleDbCommand dataCommand = dataConnection.CreateCommand())
{
dataCommand.CommandText = "SELECT Title FROM Song WHERE Song.ID = SetSong.SongID AND SetIndex.ID=SetSong.SetID AND SetIndex.ID=@ID";
dataConnection.Open();
dataCommand.Parameters.AddWithValue("@ID", ID);
DataTable table = new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = dataCommand;
adapter.Fill(table);
bindingSource1.DataSource = table;
dataGridView1.AutoResizeColums(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
dataGridView1.ReadOnly = true;
dataGridView1.DataSource = bindingSource1;
}
}
ID 是一个 int 变量,它来自一个全局类,它从列出日期的组合框中获取 ID 值(选定的 SetIndex.ID 的值)。我通过使用标签和按钮进行了测试,以确保这部分工作正常,它似乎正在检索值,将其存储在 GlobalClass.ViewBySetDate 中,并将其转换为我的 int ID 就好了。
但这会出现错误“没有为一个或多个必需参数提供值”。
有没有更好/可行的方法来做到这一点?或者,如果没有,我该如何修复错误?
先感谢您,
曼迪
编辑:我将 Select 语句更改为以下内容:
SELECT song.Title FROM SetIndex INNER JOIN (song INNER JOIN SetSong ON song.ID = SetSong.SongID) ON SetIndex.ID = SetSong.SetID WHERE ((set index.id) =[?]);
错误不再存在,但 datagridview 仍然是空白的。