2014-04-15 178 views
1

我需要保存插入該形式C#的信息:2003 DB Error1數據插入到數據庫

進入我的表在Access:FattureVoci

查詢在我的C#是:

cmd1.CommandText = "INSERT INTO FattureVoci ([IDVoce],[CodiceArticolo],[Descrizione],[Quantita],[PrezzoUnitario]) VALUES (@Id,@Prod,@Descr,@Qta,@Prezzo)"; 
      cmd1.Parameters.AddWithValue("@Categ", this.Categoria.Text); 
      cmd1.Parameters.AddWithValue("@Prod", this.Prodotto.Text); 
      cmd1.Parameters.AddWithValue("@Data", this.Data.Text); 
      cmd1.Parameters.AddWithValue("@Iva", Convert.ToInt32(this.PartitaIVA.Text)); 
      cmd1.Parameters.AddWithValue("@Descr", this.Descrizione.Text); 
      cmd1.Parameters.AddWithValue("@Qta", Convert.ToInt32(this.Qta.Text)); 
      cmd1.Parameters.AddWithValue("@Intest", this.Intestatario.Text); 
      cmd1.Parameters.AddWithValue("@Id", Convert.ToInt32(this.id.Text)); 
      cmd1.Parameters.AddWithValue("@Prezzo", Convert.ToInt32(this.Prezzo.Text)); 

而且在我的數據庫中的字段有: Error2

誤差爲d的(類型在條件表達式ATA不匹配): Erorr3

+0

你在你的sql命令中聲明瞭5個參數,但你試圖添加9個參數值?你能把你的例外翻譯成英文嗎?準確的列類型是什麼? –

+0

uhhmmm你能理解錯誤嗎? –

+0

錯誤是標準表達式中數據不匹配的類型 – Kiirito

回答

1

與您的代碼的問題是參數的插入順序。
這對於OleDb至關重要,因爲OleDb無法通過名稱識別參數。它使用命令文本中佔位符的位置來分配相應的參數值。 (OleDb使用參數佔位符作爲參數佔位符,但並不奇怪,對於Access,您也可以使用@前綴來緩解升級到Sql Server的問題)。

因此,當您添加@Categ之一作爲第一個參數時,OleDb將採用它的值並嘗試將其分配給IDVoce字段。當然這會因爲提到的錯誤而失敗。

但是,當然,您不能提供比您在查詢中設置的參數更多的參數。

cmd1.CommandText = @"INSERT INTO FattureVoci 
     ([IDVoce],[CodiceArticolo],[Descrizione],[Quantita],[PrezzoUnitario]) 
     VALUES (@Id,@Prod,@Descr,@Qta,@Prezzo)"; 
cmd1.Parameters.AddWithValue("@Id", Convert.ToInt32(this.id.Text)); 
cmd1.Parameters.AddWithValue("@Prod", this.Prodotto.Text); 
cmd1.Parameters.AddWithValue("@Descr", this.Descrizione.Text); 
cmd1.Parameters.AddWithValue("@Qta", Convert.ToInt32(this.Qta.Text)); 
cmd1.Parameters.AddWithValue("@Prezzo", Convert.ToDecimal(this.Prezzo.Text)); 


// Actually your query doesn't include these parameters, 
// so you can't put it in the collection 
// cmd1.Parameters.AddWithValue("@Data", this.Data.Text); 
// cmd1.Parameters.AddWithValue("@Categ", this.Categoria.Text); 
// cmd1.Parameters.AddWithValue("@Iva", Convert.ToInt32(this.PartitaIVA.Text)); 
//cmd1.Parameters.AddWithValue("@Intest", this.Intestatario.Text); 

我已經重新安排插入的參數爲了對應的字段名,但似乎你的領域來自Prezzo的類型是小數,而不是整數,所以不同的轉換將被要求,如果是這樣的話

作爲最後一點,如果IDVoce字段是一個AutoIncrement字段,那麼您無法在查詢中爲其值傳遞參數,您將離開工作找到數據庫的下一個自動增量編號。

+0

哦,所以基本上我沒有使用的參數,我必須消除或使他們的意見?我不能將它們留在代碼中,所以 – Kiirito

+0

我已經評論過它們,因爲我不確定是否需要它們,實際上,命令文本不需要它們,因此,如果將它們添加到Parameters集合中,您可以一個錯誤(當然在Sql Server中,不確定與OleDb和Access) – Steve

+0

謝謝,我終於明白了。 – Kiirito

0

問題1:您在您的查詢,你是5列中插入值提及,但要添加9個參數命令對象。

問題2:我不認爲OLEDB接受命名參數,所以你需要如下寫你的參數化查詢:

cmd1.CommandText = "INSERT INTO FattureVoci 
     ([IDVoce],[CodiceArticolo],[Descrizione],[Quantita],[PrezzoUnitario]) 
           VALUES (?,?,?,?,?)"; 

     cmd1.Parameters.AddWithValue("@Id", Convert.ToInt32(this.id.Text));   
     cmd1.Parameters.AddWithValue("@Prod", this.Prodotto.Text);   
     cmd1.Parameters.AddWithValue("@Descr", this.Descrizione.Text); 
     cmd1.Parameters.AddWithValue("@Qta", Convert.ToInt32(this.Qta.Text)); 
     cmd1.Parameters.AddWithValue("@Prezzo", Convert.ToInt32(this.Prezzo.Text)); 
+0

是不是特定於Access的命名參數問題還是ODBC?我不完全確定。 –

+0

@PatrickHofman OleDb和ODBC都有此限制。訪問允許@前綴 – Steve

+0

感謝澄清。 –