public void LoadDB() { string FileName = @"c:\asdf.accdb"; string query = "SELECT ID, Field1 FROM Table1 WHERE ID=? AND Field1=?"; string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName; OleDbConnection odc = new OleDbConnection(strConn); dAdapter = new OleDbDataAdapter(); OleDbCommand cmd = new OleDbCommand(query,odc); cmd.Parameters.Add("?", OleDbType.Integer, 5).Value = 1234; cmd.Parameters.Add("?", OleDbType.BSTR, 5).Value ="asdf"; dAdapter.SelectCommand = cmd; ds = new DataSet(); dAdapter.Fill(ds); dataGridView1.DataSource = ds.Tables[0]; }
Sto cercando di utilizzare la query parametrizzata per colbind il file di accesso alla vista dati. Trova bene i nomi delle colonne, ma i contenuti sono vuoti.
Come posso risolvere questo problema?
Nel mio programma di test, il ds.Tables [0] .Rows.Count datatable aveva effettivamente restituito 1 riga (poiché nel database di test c’era una riga che corrispondeva alla query stessa). Se metti una pausa su questa linea dovresti essere in grado di vedere se i dati stanno entrando o meno nel datatable in primo luogo. Prova questo:
dataGridView1.DataSource = ds.Tables[0];
Che aspetto ha l’associazione front-end di dataGridView1? L’esecuzione della query in Access potrebbe far luce sulla situazione.
Ecco un esempio di come le query con parametri funzionano con CSharp, OleDB.
try { connw.Open(); OleDbCommand command; command = new OleDbCommand( "Update Deliveries " + "SET Deliveries.EmployeeID = ?, Deliveries.FIN = ?, Deliveries.TodaysOrders = ? , connw); command.Parameters.Add(new OleDbParameter("@EMPID", Convert.ToDecimal(empsplitIt[1]))); command.Parameters.Add(new OleDbParameter("@FIN", truckSplit[1].ToString())); command.Parameters.Add(new OleDbParameter("@TodaysOrder", "R")); catchReturnedRows = command.ExecuteNonQuery();//Commit connw.Close(); } catch (OleDbException exception) { MessageBox.Show(exception.Message, "OleDb Exception"); }
Ciò funzionerà con qualsiasi istruzione sql, è necessario assegnare il punto interrogativo “?” a ciascun parametro, quindi in basso è necessario creare i parametri e aggiungerli nell’ordine in cui sono stati disposti i punti interrogativi per ottenere i dati corretti nel campo corretto.
Prova senza specificare la dimensione della colonna nei parametri:
cmd.Parameters.Add("?", OleDbType.Integer).Value = 1234; cmd.Parameters.Add("?", OleDbType.BSTR).Value ="asdf";