2012-06-07 8 views
6

Ho un questa tabella I prodotti in accesso msCome inserire un record in una tabella di accesso usando oledb?

Items(Table)  
Item_Id(autonumber) 
Item_Name(text) 
Item_Price(currency) 

e sto cercando di inserire un record utilizzando questo codice.

Il codice è in esecuzione senza errori ma alla fine non viene trovato alcun record nella tabella che errore sto facendo?

+2

Si ottiene lo stesso problema quando si rimuove le virgolette singole intorno Convert.ToDouble (itemPriceTBox.Text)? –

risposta

11

Il testo di inserimento sql non utilizza parametri.
Questa è la causa di bug e peggio (SqlInjection)

Modificare il codice in questo modo;

using(OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["DbConn"].ToString())) 
{ 
    OleDbCommand cmd = new OleDbCommand(); 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "insert into Items ([Item_Name],[Item_Price]) values (?,?); 
    cmd.Parameters.AddWithValue("@item", itemNameTBox.Text); 
    cmd.Parameters.AddWithValue("@price", Convert.ToDouble(itemPriceTBox.Text)); 
    cmd.Connection = myCon; 
    myCon.Open(); 
    cmd.ExecuteNonQuery(); 
    System.Windows.Forms.MessageBox.Show("An Item has been successfully added", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
} 

Naturalmente questo presuppone che la casella di testo per il prezzo contenga un valore numerico corretto.
Per essere sicuri aggiungere questa riga prima di chiamare il codice di cui sopra

double price; 
if(double.TryParse(itemPriceTBox.Text, out price) == false) 
{ 
    MessageBox.Show("Invalid price"); 
    return; 
} 

quindi utilizzare price come valore per il parametro @price

** EDIT 4 anni più tardi **

Questa risposta ha bisogno di un aggiornamento . Nel codice sopra, utilizzo AddWithValue per aggiungere un parametro all'insieme Parameters. Funziona ma ogni lettore dovrebbe essere avvisato che AddWithValue ha alcuni svantaggi. In particolare se si cade per il percorso facile da aggiungere solo stringhe quando la colonna di destinazione si aspetta valori o date decimali. In questo contesto, se avessi scritto solo

cmd.Parameters.AddWithValue("@price", itemPriceTBox.Text); 

il risultato potrebbe essere un errore di sintassi o una sorta di strano la conversione del valore e lo stesso potrebbe accadere con le date. AddWithValue crea una stringa Parametro e il motore del database dovrebbe convertire il valore nel tipo di colonna previsto. Ma le differenze nelle impostazioni locali tra il client e il server potrebbero creare qualsiasi tipo di errata interpretazione del valore.

Penso che sia sempre meglio usare

cmd.Parameters.Add("@price", OleDbType.Decimal).Value = 
      Convert.ToDecimal(itemPriceTBox.Text); 

Maggiori informazioni AddWithValue problems can be found here

+0

un problema ora è il record inserito e può essere visualizzato da gridview in runtime ma quando interrompo l'esecuzione del progetto e visualizzo i dati nella tabella non ci sono dati e quando eseguo nuovamente il progetto non ci sono dati nella griglia. – mepk

+0

Difficile da dire, controlla la stringa di connessione. Il codice sopra dovrebbe funzionare. Aggiungi un record con Access nella tabella e controlla se sono visibili sulla tua griglia. – Steve

+0

dopo aver inserito i dati nella tabella di accesso, il gridview mostra i record. ma il nuovo record non è inserito nella tabella. – mepk

Problemi correlati