根据 Access 数据库检查用户输入

Posted

技术标签:

【中文标题】根据 Access 数据库检查用户输入【英文标题】:Checking user input against Access database 【发布时间】:2016-02-19 14:26:20 【问题描述】:

我一直在尝试创建一个查询来检查输入的 PayrollNo 是否已存在于数据文件中,如果存在,则按钮 (BtnContinue) 将用户发送到不同的表单。我已经被困了几天,所以任何帮助都会很棒,因为我无疑离我需要的地方很近。

代码如下,为exe。在 BtnContinue_Click 上

private void BtnContinue_Click(object sender, EventArgs e)

    OleDbConnection conn = new OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\HoliPlanData.accdb;Persist Security Info=False");
    using (OleDbConnection Connstring = new OleDbConnection())
    
        conn.Open();
        String query = ("SELECT count(*) as PayrollNo FROM [Employee] where PayrollNo = @PayrollNo");
        OleDbCommand dbCmd = new OleDbCommand(query, conn);
        using (OleDbDataReader reader = dbCmd.ExecuteReader())
        
            if (reader.Read())
            
                PayrollExists form = new PayrollExists();
                form.Tag = this;
                form.Show(this);
                Hide();
            
            else
            
                EmployeeDetails form = new EmployeeDetails();
                form.PassValueFirstName = txtFirstName.Text;
                form.PassValueLastName = txtLastName.Text;
                form.PassValuePayrollNo = txtPayrollNo.Text;
                form.Tag = this;
                form.Show(this);
                Hide();
                                     
        
    

就像我说的那样,我已经坚持了一段时间,所以任何帮助都会很棒

【问题讨论】:

两个连接实例? @UweKeim 是的,看起来 Connstring 从未在 OP 的代码中使用过 conn 应该用 using 声明而不是它:) 【参考方案1】:

据我所知,您从不添加您的 @PayrollNo 参数,它对您的命令很有价值。

同时使用ExecuteScalar 而不是ExecuteReader 会更好,因为您的查询返回一列一行。

dbCmd.Parameters.Add("@PayrollNo", OleDbType.Integer).Value = yourPayrollNo;
// I assumed your column type is Integer

然后检查它;

int count = (int)dbCmd.ExecuteScalar();
if(count > 0)

   // Exist

Connstring 连接似乎不必要,因为您从不在代码中使用它。将其替换为上面一行定义的conn

作为一个完整的例子;

var conStr = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\HoliPlanData.accdb;Persist Security Info=False";
using(var conn = new OleDbConnection(conStr))
using(var dbCmd = conn.CreateCommand())

   dbCmd.CommandText = "SELECT count(*) FROM [Employee] where PayrollNo = @PayrollNo";
   dbCmd.Parameters.Add("@PayrollNo", OleDbType.Integer).Value = yourPayrollNo;

   conn.Open();
   int count = (int)dbCmd.ExecuteScalar();
   if(count > 0)
   
      PayrollExists form = new PayrollExists();
      form.Tag = this;
      form.Show(this);
      Hide();
   
   else
   
      EmployeeDetails form = new EmployeeDetails();
      form.PassValueFirstName = txtFirstName.Text;
      form.PassValueLastName = txtLastName.Text;
      form.PassValuePayrollNo = txtPayrollNo.Text;
      form.Tag = this;
      form.Show(this);
      Hide();
         

顺便说一句,OleDbCommand does not support named parameters。当您向OleDbCommand 添加参数时,唯一重要的是它们的顺序。由于您的示例中只有一个参数,因此这不是问题,但请注意。

【讨论】:

如何更改我的代码以使其有效工作? @Josh 你会在你的代码中添加额外的代码行。 Soner,我正在使用您提供的线路,但在 'cmd' 上出现错误,当前上下文中不存在名称 'Cmd' @Josh 我添加了一个完整的例子。看看吧。 再次在同一行,cmd,抛出一个错误,是否有 using.system 或我需要的东西?

以上是关于根据 Access 数据库检查用户输入的主要内容,如果未能解决你的问题,请参考以下文章

检查 Access 2010 导航子窗体是不是打开

检查用户是不是将正确版本的 Access 设置为默认值

MS Access 2013:通过 VBA 使用 MS Word 的语法检查

用于检查用户输入的布尔方法

如何添加检查用户是不是在文本字段中输入了某些内容?

access登录校验代码二