2014-09-11 62 views
0

我有一個名字,姓氏,電子郵件,主管的表單。然後,我有我的代碼背後的按鈕設置了此使用自動增量主鍵訪問數據庫和C#問題

private void agentInsertButton_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      ad.InsertCommand = new OleDbCommand("insert into Agents values ([FirstName],[LastName],[Email],[Supervisor])", con); 


      ad.InsertCommand.Parameters.Add("@FirstName", OleDbType.VarChar).Value = agentNametextBox1.Text.ToString(); 
      ad.InsertCommand.Parameters.Add("@LastName", OleDbType.VarChar).Value = agentLastNametextBox4.Text.ToString(); 
      ad.InsertCommand.Parameters.Add("@Email", OleDbType.VarChar).Value = agentEmailtextBox3.Text.ToString(); 
      ad.InsertCommand.Parameters.Add("@Supervisor", OleDbType.VarChar).Value = agentSupervisortextBox2.Text.ToString(); 

      con.Open(); 
      ad.InsertCommand.ExecuteNonQuery(); 
      con.Close(); 
     } 
     catch (Exception ex) { 
      MessageBox.Show(ex.Message); 

     }; 

我收到查詢的價值觀和目標字段的錯誤數是不一樣的。我確信這是我通過變量和AgentID導致問題的數據庫發送方式。我是新來的,但這是我的工作想要使用的。期待一個堅實的答案。

我只是用一個名爲簡單的訪問數據庫代理

字段是

AgentID - auto number 
FirstName - text 
LastName - text 
Email - text 
Supervisor - text 
+0

您可能需要爲你宣稱他們使用你的參數('@ firstname')或使用問號佔位符(?'') – Brad 2014-09-11 03:51:28

+0

此外,有沒有一些關於錯誤那向你表明這是一個PK問題?聽起來像一個參數問題 – Brad 2014-09-11 03:58:35

+0

爲什麼你在數據適配器的'InsertCommand'上調用'ExecuteNonQuery'?如果你有一個數據適配器,那麼你應該用數據適配器上的變化填充一個'DataTable'並調用'Update'。如果你不打算調用'Update',那麼適配器是毫無意義的,所以擺脫它。只需創建命令並調用它'ExecuteNonQuery'。 – jmcilhinney 2014-09-11 04:08:16

回答

3

當你寫一個INSERT聲明它必須是這樣的:

INSERT INTO TableName VALUES (ValueList) 

在這種情況下,您必須爲每列提供值並按照它們添加到表中的順序提供值,或者如下所示:

INSERT INTO TableName (ColumnList) VALUES (ValueList) 

在這種情況下,您可以按任意順序指定列的子集。你既沒有做過。你已經這樣做了:

INSERT INTO TableName VALUES (ColumnList) 

這是沒有意義的。您的SQL需要如下所示:

insert into Agents ([FirstName],[LastName],[Email],[Supervisor]) values (@FirstName,@LastName,@Email,@Supervisor) 

請注意,值現在與您添加到命令中的參數相匹配。

0

更改您這樣的查詢

ad.InsertCommand = new OleDbCommand("insert into Agents values (@FirstName,@LastName,@Email,@Supervisor)", con); 

ad.InsertCommand = new OleDbCommand("insert into Agents (FirstName,LastName,Email,Supervisor) values (@FirstName,@LastName,@Email,@Supervisor)", con); 
+0

第一個不起作用,因爲如果您省略列列表,您必須爲每列提供一個值。 – jmcilhinney 2014-09-11 04:08:58

0

OleDb的是指數型和不使用命名參數。

變化如下:

ad.InsertCommand = new OleDbCommand("insert into Agents (FirstName, LastName, Email, Supervisor) values (?, ?, ?, ?)", con); 

ad.InsertCommand.Parameters.AddWithValue("?", agentNametextBox1.Text); 
ad.InsertCommand.Parameters.AddWithValue("?", agentLastNametextBox4.Text); 
ad.InsertCommand.Parameters.AddWithValue("?", agentEmailtextBox3.Text); 
ad.InsertCommand.Parameters.AddWithValue("?", agentSupervisortextBox2.Text); 
+1

它是基於索引的,但它仍允許使用參數名稱。它會忽略它們,但使用它們仍然是一個好主意,因爲它會讓你的代碼更清晰。 – jmcilhinney 2014-09-11 05:55:02