Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入/更新发送参数有什么好处?_C#_Ms Access 2007_Oledb_Insert Update_Oledbcommand - Fatal编程技术网

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

C# 插入/更新发送参数有什么好处?,c#,ms-access-2007,oledb,insert-update,oledbcommand,C#,Ms Access 2007,Oledb,Insert Update,Oledbcommand,我是数据库新手,正在使用Access 2007数据库和C进行销售。我有以下方法: public static OleDbCommand connect() { try { string path = System.Environment.GetEnvironmentVariable("USERPROFILE"); string cadena = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+

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

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

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

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方法将值作为参数传递有什么好处?我做这件事的方式很简单,但到目前为止效果很好,这就是为什么我一直这样做的原因

String cmd = "UPDATE ingredientes SET [descripcion]=?";
这些被称为参数化SQL查询,可以避免SQL注入攻击

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

现在以使用普通SQL查询为例,看看SQL注入攻击是如何发生的

例如:

假设用户在文本框中输入以下命令

TextBox value = > "xyz;delete * from Users;"
现在命令看起来像这样

String cmd="UPDATE ingredientes SET [descripcion]=xyz;delete * from Users;";
上面的命令首先用给定的描述xyz更新表,但也从Users表中删除数据

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

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

现在以使用普通SQL查询为例,看看SQL注入攻击是如何发生的

例如:

假设用户在文本框中输入以下命令

TextBox value = > "xyz;delete * from Users;"
现在命令看起来像这样

String cmd="UPDATE ingredientes SET [descripcion]=xyz;delete * from Users;";
上面的命令首先用给定的描述xyz更新表,但也从用户表中删除数据

1-避免SQL注入

2码更干净

3-代码是可变的

1-避免SQL注入

2码更干净


3代码是可变的

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

例如,如果我在nombre字段中输入Bobby';升降台安全装置;-。如果未正确清理输入,可能会丢失整个表,具体取决于权限


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

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

例如,如果我在nombre字段中输入Bobby';升降台安全装置;-。如果未正确清理输入,可能会丢失整个表,具体取决于权限


因此,如果您只是简单地使用参数化查询,您将得到更好的保护,而不必为每个输入提供自己的卫生例程。

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

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


如果我错了,请告诉我

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

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


如果我错了,请告诉我

谢谢大家!!您的回答非常清楚,我没有想到我确实想避免的那种可能性。@user3312437:不客气,亲爱的:,我很高兴能为您提供帮助。谢谢!你的回答非常清楚,我没有想到我一定要避免的那种可能性。@user3312437:不客气,亲爱的:,我很高兴能得到你的帮助。是的,你说得对,谢谢你的回答,我想知道我是否应该把改变插入和更新信息的方式作为我的首要任务,但是,由于这不是一个web项目,不会被许多用户使用,而且用户也没有编程知识,我不认为这将是一个短期问题,所以我将暂时保持现状,并在将来对其进行改进。再次感谢你。是的,你说得对,谢谢你的回答,我想知道我是否应该把改变我插入和更新信息的方式作为我的主要优先事项,但由于这不是一个web项目,不会被许多用户使用,而且用户也不具备编程知识,我认为这不会成为一个问题 这是一个短期的问题,所以我现在就不做了,将来我会改进它。再次感谢你。