插入/更新发送参数有什么好处?

时间:2014-02-15 04:13:04

标签: c# ms-access-2007 oledb insert-update oledbcommand

我是数据库的新手,我正在使用带有C#的Access 2007数据库进行销售。我有以下方法:

public static OleDbCommand connect()
{
    try
    {
        string path = System.Environment.GetEnvironmentVariable("USERPROFILE");
        string cadena = @"Provider=Microsoft.ACE.OLEDB.12.0;Data   Source="+path+@"\Documents\VikingPOS.accdb";
        conexion = new OleDbConnection(cadena);
        conexion.Open();
        command = new OleDbCommand();
        command = conexion.CreateCommand();
        return command;

    }
    catch (OleDbException e)
    {
        MessageBox.Show("Error: {0}", e.Errors[0].Message);
        return null;
    }
}

所以我一直以这种方式插入和更新表的信息:

OleDbCommand link = Conexion.connect();
link.CommandText = "UPDATE ordenes SET subtotal = " + subtotal + ",impuesto = " + impuesto + ",total = " + total + " WHERE id_mesa = " + id_mesa + " AND id_estado = 1";
link.ExecuteNonQuery();

OleDbCommand link = Conexion.connect();
link.CommandText = "INSERT INTO secciones(descripcion,fecha_insert) VALUES ('" + nombre + "',Date())";
link.ExecuteNonQuery();

但我也看到有些人使用以下语法插入和更新:

using (OleDbConnection myCon = new OleDbConnection(connectionString))
{
    try
    {
        OleDbCommand cmd = new OleDbCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "UPDATE ingredientes SET [descripcion]=?,[id_medida]=?,[id_categoria]=?,[costo]=?,[impuesto]=?,[precio_venta]=?,[existencia]=?,[fecha_insert]=? WHERE [id_ingrediente]=?";
        cmd.Parameters.AddWithValue("@descripcion", p.getNombre());
        cmd.Parameters.AddWithValue("@id_medida", p.getId_medida());
        cmd.Parameters.AddWithValue("@id_categoria", p.getId_categoria());
        cmd.Parameters.AddWithValue("@costo", p.getCosto());
        cmd.Parameters.AddWithValue("@impuesto", p.getImpuesto());
        cmd.Parameters.AddWithValue("@precio_venta", p.getPrecio_venta());
        cmd.Parameters.AddWithValue("@existencia", p.getExistencia());
        cmd.Parameters.AddWithValue("@fecha_insert", fechaHoy);
        cmd.Parameters.AddWithValue("@id_ingrediente", p.getId());
        cmd.Connection = myCon;
        myCon.Open();
        int x = cmd.ExecuteNonQuery();
        ...

所以我的问题是,使用“AddWithValue”方法将值作为参数传递有什么好处?我这样做的方式很简单,但到目前为止工作得很好,这就是为什么我一直这样做。

4 个答案:

答案 0 :(得分:4)

String cmd = "UPDATE ingredientes SET [descripcion]=?";

这些称为参数化SQL查询,它可以避免 SQL注入攻击

当您通过将值直接注入表列来使用sql语句时,可能会误用它来访问/修改数据。

现在举一个使用普通SQL查询的例子,看看SQL注入攻击是如何发生的

示例:

String cmd="UPDATE ingredientes SET [descripcion]='"+TextBox1.Text+"'";

letus假设用户在TextBox中输入以下命令

TextBox value = > "xyz;delete * from Users;"

now命令看起来像这样

String cmd="UPDATE ingredientes SET [descripcion]=xyz;delete * from Users;";

上面的命令首先使用给定的描述xyz更新表,但也删除Users表中的数据

答案 1 :(得分:0)

1 - 避免SQL注入

2-Code更清洁

3代码可以更改

答案 2 :(得分:0)

一个主要好处是它可以保护您免受SQL注入攻击。

例如,如果我放入nombre字段Bobby'; DROP TABLE secciones;--,该怎么办?如果您没有正确清理输入,则可能会丢失整个表(取决于权限)。

因此,如果您只是使用参数化查询,而不是必须为每个输入提供自己的卫生程序,那么您将受到更好的保护。

答案 3 :(得分:0)

您的问题是为什么要添加参数而不是简单地创建OLE DB字符串并形成SQL查询。对?

使用字符串连接生成Query的问题是:SQL注入。如果您为多个用户或网页制作代码。然后,您必须使用Parameters.Addvalue方法来提高安全性。此外,对于程序员来说,Parameters.Add值更直观。但如果它只是一个涉及很少人的小项目,那么使用它就完全没问题了。

如果我错了,请告诉我。!