【问题标题】:Checking user input against Access database根据 Access 数据库检查用户输入
【发布时间】: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 声明而不是它:)

标签: c# .net ms-access


【解决方案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 或我需要的东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多