Uso de parámetros para insertar datos en la base de datos de acceso.

Resuelto Arianule asked hace 13 años • 3 respuestas

Tengo el siguiente método para insertar datos en una base de datos de acceso, que funciona bien, pero tengo un problema si intento insertar texto que contenga 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 tengo entendido, una de las formas de resolver el problema es mediante el uso de parámetros. Para ser honesto, no estoy seguro de cómo hacer esto. ¿Cómo podría cambiar el código anterior para insertar los datos utilizando parámetros?

Arianule avatar May 05 '11 14:05 Arianule
Aceptado

Lo mismo que para cualquier otra consulta:

a) Reemplace los parámetros codificados reales en su OleDbCommandcon marcadores de posición (con el prefijo @),
b) Agregue instancias de OleDbParametera la DbCommand.Parameterspropiedad. 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();
      }
   }
}
vgru avatar May 05 '2011 07:05 vgru

Tienes que usar Parámetro para insertar Valores. También es un problema de seguridad. Si lo hace así, se podría realizar una inyección SQL.

Prueba así:

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();
  }
}
heikofritz avatar May 05 '2011 07:05 heikofritz