解决 查询问题"最多一项结果"

PDS8475

活跃成员
已加入
2019年6月25日
留言内容
41
编程经验
Beginner
我必须访问表
待售物品
工程

我有一个文本框
Details1_textBox

我将Details1_textBox.text传递给参数@s

这Details1_textBox.text value is a name

这ItemsForSale table doesn't contain a Name column
工程表的效果如何
两个表都包含一个“序列”列

这output of the query is displayed in the DataGridView called idataGridView

我正在尝试对idataGridView中的记录进行排序,以仅根据在Details1_textBox中输入的名称显示记录

我正在使用查询

C#:
"Select * FROM ItemsForSale WHERE Serial = (SELECT Serial FROM Engineering WHERE Engineering.[Name] = @s)"

但这给了我一个例外"此子查询最多只能返回一条记录"

我如何需要查询才能返回多个记录

我知道我编写的C#代码可以正常工作,好像我将查询更改为简单的东西一样可以正常工作,因此为什么我只放置查询。
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
永不遗漏任何信息。这是什么数据库?

无论如何,看起来你想加入 join子句-C#参考 或者 C#LINQ加入SQL 如果两个字段中的详细信息相同,您也可以查看UNION。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
是的,但是您永远不能太确定!

所以我总是喜欢确认。 ;)
 

PDS8475

活跃成员
已加入
2019年6月25日
留言内容
41
编程经验
Beginner
我正在尝试学习C#
因此,这实际上不是将要使用的数据库。但是我已经基于我自愿去的地方建立了数据库和应用程序。
这是应用程序的报告形式,其中包含一个组合框(用于选择要搜索的内容),一个文本框(用于输入详细信息),一个按钮(包含用于搜索/过滤记录的代码)和四个用于查看记录的DataGridViews(分别对应于数据库中的一个表) 。当表单加载时,将显示所有记录,并且当用户单击搜索时,组合框和文本框的组合将过滤记录。三个DataGridView可以正常工作,因为它们具有正在搜索的列,但是第四个没有,这就是我遇到的麻烦。
这full code for this part of the search button function Is below
C#:
               string iConString = System.IO.File.ReadAllText("FixIT.con");
                iConString = iConString.Replace(System.Environment.NewLine, string.Empty);

                System.Data.OleDb.OleDbConnection iconnn = new System.Data.OleDb.OleDbConnection();
                string iconnsString = "Provider = Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + iConString;
                try
                {

                    using (OleDbConnection iconnection = new OleDbConnection(iconnsString))
                    {

                        using (OleDbCommand icommand = new OleDbCommand("Select * FROM ItemsForSale WHERE Serial = (SELECT Serial FROM Engineering WHERE Engineering.[Name] = @s)", iconnection))
                        {

                            icommand.CommandType = CommandType.Text;
                            icommand.Parameters.AddWithValue(@s, Details1_textBox.Text);
                            using (OleDbDataAdapter iDA = new OleDbDataAdapter(icommand))
                            {

                                using (DataTable iDT = new DataTable())
                                {

                                    iDA.Fill(iDT);
                                    idataGridView.DataSource = iDT;
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    TextWriter tw = new StreamWriter("ex.txt");
                    tw.WriteLine(ex);
                    tw.Close();
                }
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,537
地点
弗吉尼亚州切萨皮克
编程经验
10+
上面没有关于使用JOIN获取所需数据的信息。这不是C#问题,而是SQL问题。您还需要学习SQL以获取所需的数据。

如果使用纯C#方式进行此操作,则需要将两个不同的表的所有行加载,然后在代码中手动执行联接。不要这样建立数据库可以非常有效地执行此类操作。

As a quick aside, what's the logic behind your curious variable naming convention: iconn, iconnString, iconnection, etc.? Why the "i" prefix?
 

PDS8475

活跃成员
已加入
2019年6月25日
留言内容
41
编程经验
Beginner
上面没有关于使用JOIN获取所需数据的信息。这不是C#问题,而是SQL问题。您还需要学习SQL以获取所需的数据。

如果使用纯C#方式进行此操作,则需要将两个不同的表的所有行加载,然后在代码中手动执行联接。不要这样建立数据库可以非常有效地执行此类操作。

As a quick aside, what's the logic behind your curious variable naming convention: iconn, iconnString, iconnection, etc.? Why the "i" prefix?
这"I"只捐赠在这种情况下使用的表ItemsForSale,前缀是"e"用于工程表等
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,537
地点
弗吉尼亚州切萨皮克
编程经验
10+
奇怪,但是还可以。需要注意的两件事:
1).NET Framework的推荐 命名约定 不使用 匈牙利文符号 -或者简单地说,不要使用前缀。
2)如果您遵循 单一责任原则,您将拥有一些小的方法,它们的长度大约只有20-30行。名称冲突的机会是,如此小的函数会急剧下降,以至于您实际上并不需要命名约定。
 

PDS8475

活跃成员
已加入
2019年6月25日
留言内容
41
编程经验
Beginner
感谢您的帮助。我现在用下面的查询来完成它。
C#:
"Select * FROM ItemsForSale INNER JOIN Engineering ON Engineering.Serial = ItemsForSale.Serial WHERE Engineering.Name = @s"
 
最佳 底部