utilizzando parametri che inseriscono dati nel database di accesso

Ho il seguente metodo per inserire dati in un databas di accesso che funziona bene, ma ottengo un problema se provo ad inserire del testo che contiene citazioni singole che ho imparato.

[WebMethod] public void bookRatedAdd(string title, int rating, string review, string ISBN, string userName) { OleDbConnection conn; conn = new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("App_Data\\BookRateInitial.mdb")); conn.Open(); OleDbCommand cmd = conn.CreateCommand(); cmd.CommandText = @"INSERT INTO bookRated([title], [rating], [review], [frnISBN], [frnUserName])VALUES('" + title + "', '" + rating + "','" + review + "','" + ISBN + "', '" + userName + "')"; cmd.ExecuteNonQuery(); conn.Close(); } 

Da quello che ho capito uno dei modi per risolvere il problema è usando i parametri. Non sono sicuro di come farlo per essere onesti. Come posso cambiare il codice sopra così che inserisco i dati usando i parametri?

Cordiali saluti Arian

Come per qualsiasi altra query:

a) Sostituisci i parametri hardcoded reali nel tuo OleDbCommand con i segnaposto (preceduti da @ ),
b) Aggiungere istanze di OleDbParameter alla proprietà DbCommand.Parameters . I nomi dei parametri devono corrispondere ai nomi dei segnaposto.

 [WebMethod] public void bookRatedAdd(string title, int rating, string review, string ISBN, string userName) { using (OleDbConnection conn = new OleDbConnection( "Provider=Microsoft.Jet.OleDb.4.0;"+ "Data Source="+Server.MapPath("App_Data\\BookRateInitial.mdb")); { conn.Open(); // DbCommand also implements IDisposable using (OleDbCommand cmd = conn.CreateCommand()) { // create command with placeholders cmd.CommandText = "INSERT INTO bookRated "+ "([title], [rating], [review], [frnISBN], [frnUserName]) "+ "VALUES(@title, @rating, @review, @isbn, @username)"; // add named parameters cmd.Parameters.AddRange(new OleDbParameter[] { new OleDbParameter("@title", title), new OleDbParameter("@rating", rating), ... }); // execute cmd.ExecuteNonQuery(); } } } 

Devi usare il parametro per inserire valori. È anche un problema di sicurezza. Se lo fai ti potrebbe fare una iniezione sql.

Prova così:

 string ConnString = Utils.GetConnString(); string SqlString = "Insert Into Contacts (FirstName, LastName) Values (?,?)"; using (OleDbConnection conn = new OleDbConnection(ConnString)) { using (OleDbCommand cmd = new OleDbCommand(SqlString, conn)) { cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("FirstName", txtFirstName.Text); cmd.Parameters.AddWithValue("LastName", txtLastName.Text); conn.Open(); cmd.ExecuteNonQuery(); } } 

Per Microsoft Access i parametri sono basati sulla posizione e non nominati, dovresti usare ? come simbolo del segnaposto anche se il codice funzionerebbe se si usassero i parametri del nome purché fossero nello stesso ordine.

Consultare la documentazione per OleDbCommand.Parameters Property

Osservazioni

Il provider OLE DB .NET non supporta i parametri denominati per il passaggio di parametri a un’istruzione SQL o una stored procedure richiamata da un OleDbCommand quando CommandType è impostato su Testo. In questo caso, deve essere utilizzato il segnaposto punto interrogativo (?). Per esempio:

 SELECT * FROM Customers WHERE CustomerID = ? 

Pertanto, l’ordine in cui gli oggetti OleDbParameter vengono aggiunti a OleDbParameterCollection deve corrispondere direttamente alla posizione del segnaposto del punto interrogativo per il parametro nel testo del comando.

Assicurarsi di includere il tipo di schema previsto in cui verrà utilizzato il parametro E la lunghezza dello schema, se applicabile.

Raccomando inoltre di utilizzare sempre le istruzioni relative alle istanze in cui il tipo implementa IDisposable come OleDbConnection modo che la connessione sia sempre chiusa anche se nel codice viene generata un’eccezione.

Codice modificato:

 var connectionStringHere = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("App_Data\\BookRateInitial.mdb"; using (var conn = new OleDbConnection(connectionStringHere)) using (var cmd = conn.CreateCommand()) { cmd.CommandText = "INSERT INTO bookRated ([title], [rating], [review], [frnISBN], [frnUserName]) VALUES(?, ?, ?, ?, ?)"; cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 100) { Value = title}); cmd.Parameters.Add(new OleDbParameter("?", OleDbType.Integer) { Value = rating }); cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 2000) { Value = review }); cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 60) { Value = ISBN }); cmd.Parameters.Add(new OleDbParameter("?", OleDbType.VarChar, 256) { Value = userName }); conn.Open(); var numberOfRowsInserted = cmd.ExecuteNonQuery(); } 
  OleDbCommand cmd = new OleDbCommand("insert into table_name (ID,Type,SrNo) Values ('" + textboxId.Text + "','" + textboxType.Text + "' ,'" + textboxSr.Text + "');", oc); cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); MessageBox.Show("Data has been saved successfully"); cmd.Dispose();