2016-02-19 47 views
-1

我一直在試圖創建一個查詢來檢查輸入的PayrollNo是否已經存在於數據文件中,如果是這樣,對於按鈕(BtnContinue)將用戶發送到不同的表單。我被困了幾天,所以任何幫助都會很大,因爲我毫無疑問接近我需要的地方。檢查對Access數據庫的用戶輸入

代碼如下,待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(); 
      }       
     } 
    } 

像我這樣說一直停留在這個有一段時間了,因此任何幫助,將是輝煌的

+0

兩個連接實例? –

+1

@UweKeim是的,看起來'Connstring'從來沒有用在OP的代碼'conn'應該用''using'語句代替它包裝:) –

回答

6

據我所看到的,你從未添加@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時,唯一的問題是他們的訂單。由於您的示例中只有一個參數,因此這裏不是問題,但請注意。

+0

我該如何改變我的代碼以使其有效工作? – Josh

+0

@Josh您可以在代碼中添加額外的代碼行。 –

+0

Soner,我正在使用你提供的這一行,我在'cmd'上得到一個錯誤'Cmd'在當前上下文中不存在 – Josh