utilizando parámetros insertando datos en la base de datos de acceso

Tengo el siguiente método para insertar datos en una base de datos de acceso que funciona bien, pero me sale un problema si trato de insertar texto que contiene comillas simples que he aprendido.

[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(); } 

Por lo que entiendo una de las formas de resolver el problema es mediante el uso de parámetros. No estoy seguro de cómo hacer esto para ser honesto. ¿Cómo podría cambiar el código anterior para insertar los datos usando parámetros?

Saludos cordiales a Arian

Lo mismo que para cualquier otra consulta:

a) Reemplace los parámetros reales codificados en su OleDbCommand con marcadores de posición (con el prefijo @ ),
b) Agregue instancias de OleDbParameter a la propiedad DbCommand.Parameters . Los nombres de los parámetros deben coincidir con los nombres de los marcadores de posición.

 [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(); } } } 

Tienes que usar el parámetro para insertar valores. También es un problema de seguridad. Si lo haces así, una inyección de sql podría realizarse.

Pruebe de esta manera:

 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(); } } 

Para Microsoft Access, los parámetros están basados ​​en posición y no tienen nombre, ¿debería usarlos ? como el símbolo de marcador de posición aunque el código funcionaría si usara parámetros de nombre siempre que estén en el mismo orden.

Consulte la documentación de OleDbCommand.Parameters Property

Observaciones

El proveedor OLE DB .NET no admite parámetros con nombre para pasar parámetros a una instrucción SQL o un procedimiento almacenado llamado por un OleDbCommand cuando CommandType está establecido en Texto. En este caso, se debe usar el marcador de posición de interrogación (?). Por ejemplo:

 SELECT * FROM Customers WHERE CustomerID = ? 

Por lo tanto, el orden en el que se agregan los objetos OleDbParameter a OleDbParameterCollection debe corresponder directamente con la posición del marcador de posición del signo de interrogación para el parámetro en el texto del comando.

Asegúrese de incluir el tipo de esquema esperado donde se usará el parámetro Y la longitud del esquema, si corresponde.

También te recomiendo que siempre uses instrucciones en torno a tus instancias donde el tipo implemente IDisposable como OleDbConnection para que la conexión siempre esté cerrada incluso si se lanza una excepción en el código.

Código modificado:

 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();