从 C# 表单中搜索两个访问表

Posted

技术标签:

【中文标题】从 C# 表单中搜索两个访问表【英文标题】:search inside two access tables from C# form 【发布时间】:2020-12-30 22:40:26 【问题描述】:

这是我的代码,我如何在 Table1 和 Table2 中搜索相同的 textbox1.text 值,换句话说:

// [表1]

| name     | age            |
| -------- | -------------- |
| aaa      | 12             |
| bbb      | 13             |
| ccc      | 14             |

//     [Table2]
| name     | gender         |
| -------- | -------------- |
| aaa      | male           |
| bbb      | female         |
| ccc      | male           |

当 [name] 等于 textbox1.text 时,如何获取年龄和性别值并将其显示在 txt.Text 中?

谢谢

 con.Open();
            // search inside table1
            OleDbCommand da = new OleDbCommand("SELECT * FROM [Table1] WHERE Table1.name='@name",con);
 
           //search inside table2
            OleDbCommand da2 = new OleDbCommand("SELECT * FROM [Table2] WHERE Table2.name='@name", con);
            
            // give @name value to table1 and table2 as parameters
            da.Parameters.AddWithValue("@name",textBox1.Text);
            da2.Parameters.AddWithValue("@name", textBox1.Text);

            // its time for executing 
            OleDbDataReader dr = da.ExecuteReader();
            OleDbDataReader dr2 = da2.ExecuteReader();

            // now display it in textBox as a string
            if (dr.Read())
            
                dr2.Read();
                for (int x = 0; x < 4;x++ ) 
                    if(dr[x].ToString() !="")

                        txt.Text += dr[x].ToString() + System.Environment.NewLine;
                    
                
            
            else  MessageBox.Show("error"); 
            con.Close();

【问题讨论】:

内联表 关系可以作为内连接实例吗? 为什么这个数据甚至在两个表中而不是一个?可能应该保存生日并计算年龄。 你的SQL好像有语法错误;奇数个撇号 另外,您使用读者的 Read() 方法的逻辑有点不靠谱。使用数据适配器并填充数据表 【参考方案1】:

将数据连接在一起并限制在文本框中写入的内容并在 datagridview 控件中显示:

using(var da = new OleDbDataAdapter("SELECT FROM Table1 t1 INNER JOIN Table2 t2 ON t1.Name = t2.Name WHERE t1.name=@name", con))
    da.SelectCommand.Parameters.AddWithValue("@name",textBox1.Text);

    var dt = new DataTable();
    da.Fill(dt);

    someDataGridView.DataSource = dt;

这实际上就是您需要做的所有事情;数据适配器将打开连接等;只需编写一个 sql,添加参数,填充数据表,将表分配为网格的 DataSource(您需要在表单中添加一个 datagridview 并为其命名并调整代码名称)

【讨论】:

我可以在文本框多行显示吗? 是的,你可以......但你不应该因为它看起来很糟糕,除非你设置一个等宽字体并用空格填充数据,这样它就有一个一致的宽度——这就是我们所做的40 年前基于终端的系统。如果您对此有信心,请编写一个循环来遍历数据表中的行,并将它们的字符串表示形式添加到文本框中。您最终会得到一个缓慢的结果,缺乏功能(排序、编辑)和灵活性,并且维护和更新是一件苦差事。我看不到任何积极的一面 先生,我知道它看起来很糟糕,但我想自定义它并垂直显示数据并在每行添加一些常量文本,然后如果用户在打印之前进行任何编辑,他可以轻松完成我每列有 15 列,有些列有空值,我不想向用户显示它 然后考虑一个报告解决方案;很多存在 - github.com/ritchiecarroll/Report.NET 出现在“c# 报告库”的前 5 个结果中 - 从未使用过它,但它似乎是合理的(TableLayoutSample 看起来是你想要的) 如果您的问题得到解决,您应该单击灰色复选标记将其变为绿色。这意味着它在仪表板上以不同的颜色显示,人们知道它已被回答

以上是关于从 C# 表单中搜索两个访问表的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 上的函数处理程序访问表单控件

如何使用 C# 从文本框中的访问数据库中获取数据

如何将自动填充的表单记录(从另一条记录创建)添加到访问表中?

(访问)在文本字段中搜索与另一个表字段中的字符串匹配的字符串,并在子表单中显示这些匹配记录

搜索后未找到访问表单记录源

C# winform:从其他表单访问公共属性以及静态和公共属性之间的区别