从 Access MDB 获取数据行并显示在文本框中

Posted

技术标签:

【中文标题】从 Access MDB 获取数据行并显示在文本框中【英文标题】:Get data row from Access MDB and show in text box 【发布时间】:2016-08-25 11:20:17 【问题描述】:

我有一个访问数据库(mdb)。其中有列 ID、名称、电子邮件 ID。我有文本框来显示结果,比如 ID_textbox、Name_textbox、EmaiId_textbox。我有一个文本框和一个名为 find 的按钮。

我想要的是当我在文本框中输入一个值并单击查找按钮时。它应该在 ID 列中搜索值并获取该行的名称和电子邮件的结果并将其显示在文本框中。

您的帮助将不胜感激。谢谢

我已经用谷歌搜索过了,这不是一个重复的问题。我在谷歌找不到答案,所以我提出了一个问题。请帮帮我。

我尝试了一些代码

public void fff(string recno)


    myconn.ConnectionString = connestr;
    OleDbDataAdapter adap = new OleDbDataAdapter();
    dtcmd.Connection = myconn;
    dtcmd.CommandText = "SELECT * FROM sample WHERE [id] = '" + recno + "'";
    myconn.Open();
    var dr = dtcmd.ExecuteReader();
    dr.Read();
    email_tb.Text = dr.GetString(2);
    dr.Close();
    dtcmd.ExecuteNonQuery();
    myconn.Close();

我发现了问题。以上是公共功能,不会改变 tb 值。如何解决它

【问题讨论】:

除了 SQL 注入漏洞和资源处置不当之外,这段代码看起来还可以。它在做什么?会出错吗? 它不显示文本框中的文本。什么都没有发生... 【参考方案1】:
        dtcmd.Connection = myconn;
        dtcmd.CommandText = "SELECT Name, EmailId FROM sample WHERE [id] = '" + find_tb.Text + "'";
        if (myconn.State == ConnectionState.Closed)
        
            myconn.Open();
        
        OleDbDataReader dr = dtcmd.ExecuteReader();
        if (dr.HasRows)
        
            while (dr.Read())
            
                email_tb.Text = dr["EmailId"].ToString();
            
        
        dr.Close();
        myconn.Close();

【讨论】:

没有用,同时也不起作用。但是,如果我在底部使用此 cmd dtcmd.ExecuteNonQuery();,则会显示错误。 An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll Additional information: There is already an open DataReader associated with this Command which must be closed first. If (dr.Read()) 是 if (dr.HasRows) if (dr.Read() 的快捷方式 如果您使用while (dr.Read()) email_tb.Text = dr["EmailId"].ToString(); ,那么如果您有10条记录,您将在TextBox中看到最后一条记录的结果。 还要避免以这种方式编写查询。使用参数化查询来防止 SQL 注入攻击。 离题,但正如我在另一篇文章中所说,不要发布仅代码的答案。可能您的母语不是英语,但不要担心。这里的大多数人都不是以英语为母语的人。向您的问题添加一些简单的描述就足以向其他用户展示您的答案可能有用的原因。【参考方案2】:

将您的 IF 语句更改为 While,它将起作用

while (dr.Read())
    
        email_tb.Text = dr.GetString(0);
    

【讨论】:

if(表达式)和 while(表达式)。您为什么认为如果将 if() 转换为 while() 会起作用?为什么 if (false) 与 while(false) 不同?或者当 while 循环应该只执行一次时 if(true) 与 while(true) 不同? 是的,如果只执行一次,那么没有区别。【参考方案3】:

互联网上有很多关于这个问题的答案,还有大量的入门视频展示了如何做到这一点。无论如何,您可以使用 codeplex 和 Linq 中的 IQToolkit,这样会更容易编码:

var data = db.TableName.SingleOrDefault( r => r.ID == ID_textbox );
if (data != null)

  Name_textbox.Text = data.Name;
  EmaiId_textbox.Text = data.Email;

这只是众多方法中的一种。

编辑:这是基于您稍后添加的示例代码:

string path=@"c:\myFolder\MyDb.mdb";
using(OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+path))

   var cmd = new OleDbCommand(@"SELECT Name, EmailId 
    FROM sample 
    WHERE [id] = @id"; 
   cmd.Parameters.AddWithValue("@id", find_tb.Text.Trim());
   con.Open();
   OleDbDataReader dr = cmd.ExecuteReader();
   if (dr.Read())
   
      email_tb.Text = (string)dr["EmailId"];
   
   con.Close();

您正在搜索字符串值,其尾随空格可能会影响结果以及大小写。如果它没有找到任何东西:

    确定不是大小写问题。 确保您正在查看正确的 mdb 文件(访问是基于文件的,并且在项目中,您正在查看的文件可能不是您认为的文件,除非您使用的是完整路径和文件名)。

【讨论】:

对不起,伙计,我不明白答案是什么 db 是数据表还是数据集。我定义了一个数据表(dt)。 嘿,谢谢你重播.. 我发现了问题......我在公共 void 函数中使用它。它不会改变 tb 的文本。如何修复它。我无法将其设为私有,因为我正在从另一个表单调用此函数 对不起,我不明白你的意思。如果您的意思是您使用的地方无法访问 UI,请使用该方法仅返回行数据。

以上是关于从 Access MDB 获取数据行并显示在文本框中的主要内容,如果未能解决你的问题,请参考以下文章

通过单击按钮将数据从 Access 获取到 C# 中的文本框

从 Ms Access Mdb 文件获取数据到 sql server 2005 的最佳方法

ACCESS打得开mdb,但打不开表,弹框提示未知错误。

当 Access mdb 有密码时,来自 C# 的 MailMerge

将列转换为行并在 Access 中获取复选框的总和

VB.Net 和 Access - 获取累加器值