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

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

最佳答案

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

这些称为参数化 SQL 查询,可避免 SQL 注入(inject)攻击

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

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

示例:

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

让我们假设如果用户在 TextBox 中输入以下命令

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

现在命令看起来像这样

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

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

关于c# - 插入/更新发送参数有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21793299/

相关文章:

c# - OleDbCommand 参数顺序和优先级

c# - 使用 SharePoint 2010 中使用托管元数据的 KeywordQuery 显示自定义用户属性?

c# - C# 中 OrderBy Switch 的替代品

c# - 如何在 C# 中将数据从 Sqlserver 2008 数据库表插入 MS Access

ms-access - Access - 从表单中的图像控件导出图像

c# - 在 C# 中处理 NULL (\0)

C#、Excel、OleDB、插入语句不起作用

c# - CheckedListBox 和带有索引的选中项目列表

c# - Eric Lippert 的挑战 "comma-quibbling",最佳答案?

ms-access - VBA 使用全局变量 Access 奇怪的行为