2

我正在尝试用 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 仍然是空白的。

4

2 回答 2

2

测试你在数据库中查询。。访问数据库的方法是一样的,但是你的查询是错误的

SELECT Title FROM Song WHERE Song.ID = SetSong.SongID AND SetIndex.ID=SetSong.SetID AND SetIndex.ID=@ID

SetSong 未在查询中定义。

于 2012-04-10T22:15:38.233 回答
0
grigview1.datasource = table;

gridview1.databind();
于 2013-02-27T11:15:52.727 回答