2014-02-15 30 views
2

我是新的數據庫,並正在使用C#的Access 2007數據庫銷售點。我有以下方法:插入/更新發送參數有什麼好處?

public static OleDbCommand connect() 
{ 
    try 
    { 
     string path = System.Environment.GetEnvironmentVariable("USERPROFILE"); 
     string cadena = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="[email protected]"\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
String cmd = "UPDATE ingredientes SET [descripcion]=?"; 

這些被稱爲參數化的SQL查詢避免了SQL注入攻擊

當您通過將值直接注入到表列中來使用sql語句時,有可能會錯誤地使用sql語句來訪問/修改數據。

現在

採取使用正常的SQL查詢的示例,並瞭解SQL注入攻擊可能發生

實施例:

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

suffers。讓我們假設,如果用戶進入下面的在文本框命令

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

現在的命令看起來像這樣

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

上述命令第一,更新表具有給定描述的xyz而且從Users表刪除數據

+0

謝謝!你的回答非常清楚,我沒有想到我希望避免的那種可能性。 – Dukra

+0

@ user3312437:不客氣親愛的:),我很高興能幫到你。 –

0

1-避免SQL注入

2碼是清潔器

3-代碼是多變

0

一個主要的好處是它可以保護您免受SQL注入攻擊。

例如,如果我在​​字段Bobby'; DROP TABLE secciones;--中輸入什麼內容。如果您沒有正確清理輸入,則可能會丟失整個表(具體取決於權限)。

因此,如果您只是簡單地使用參數化查詢,您將得到更好的保護,而不必爲每個輸入提供自己的衛生程序。

0

你的問題是爲什麼要添加參數,而不是簡單地做一個OLE DB字符串和形成SQL查詢。對?

使用字符串連接生成查詢的問題是:SQL注入。如果您爲多個用戶或網頁製作代碼。然後,您必須使用Parameters.Addvalue方法來提高安全性。而且,對於程序員來說,Parameters.Add值更直觀。但如果它只是一個涉及很少人的小項目,那麼使用它就完全沒問題。

如果我錯了,請讓我知道。

+0

是的,你說得對,謝謝你的回答,我想知道是否應該改變我插入和更新信息的方式作爲我的主要優先事項,但因爲這不是一個Web項目,並且不會許多用戶都使用它(並且用戶也沒有編程知識),我不認爲這會是一個短期問題,所以我會保持現在的狀態,我會在未來。再次感謝你。 – Dukra