2013-03-07 244 views
0

我创建了插入新记录的函数 - 我直接向它提交查询。 我的问题是最佳吗?这是否可靠,并保证正常运行?如果不;请指教。从C#到MySQL执行INSERT语句的正确方法

static String Server = ""; 
static String Username = ""; 
static String Name = ""; 
static String password = ""; 

static String conString = "SERVER=" + Server + ";DATABASE=" + Name + ";UID=" + Username + ";PASSWORD=" + password + ";connect timeout=500000;Compress=true;"; 

public bool InsertSQL(String Query) 
{ 
    int tmp = 0; 
    try 
    { 
     using (MySqlConnection mycon = new MySqlConnection(conString)) 
     { 
      using (MySqlCommand cmd = new MySqlCommand(Query, mycon)) 
      { 
       mycon.Open(); 
       try 
       { 
        tmp = cmd.ExecuteNonQuery(); 
       } 
       catch 
       { 
        if (mycon.State == ConnectionState.Open) 
        { 
         mycon.Close(); 
        } 
       } 
       mycon.Close(); 
      } 
     } 
    } 
    catch { return tmp > 0 == true ? true : false; } 
    return tmp > 0 == true ? true : false; 
} 

这是我在其他函数中创建的SQL插入并传递为文本插入函数。我接受所有建议!

String insertSql = @"INSERT INTO `gps_unit_location` 
      (`idgps_unit`,`lat`,`long`,`ip`,`unique_id`, 
      `loc_age`,`reason_code`,`speed_kmh`, 
      `VehHdg`,`Odometer`,`event_time_gmt_unix`,`switches`, `engine_on_off`, `dt`) 
       VALUES 
      (
      (Select idgps_unit from gps_unit where serial=" + serial + "),'" + lat + "','" + lon + "','" + IP + "','" + unique_id + @"', 
      '" + LocAge_mins + "','" + ReasonCode + "','" + Speed + @"', 
      '" + VehHdg + "','" + Odometer + "','" + EventTime_GMTUnix + "','" + Switches + "', '" + engine_on_off + @"', DATE_ADD(NOW(), INTERVAL 1 HOUR)) 
      "; 
+0

你在哪里设置查询对象? – Brian 2013-03-07 17:01:58

+0

它被设置在其他功能中并作为文本传递 – Andrew 2013-03-07 17:02:56

回答

2

通过使这个如此通用,你将自己打开到SQL injection。我猜你必须建立查询并直接插入值。 SQL参数在这里会更好,你可能会传入SqlParametersparams,但是这仍然依赖于发送的通用文本,并仍然让你打开注入。

Here is a SQL Parameter example

+0

您的建议是什么?我添加了查询示例。你能建议你如何做到这一点? – Andrew 2013-03-07 17:05:54

+0

@Andrew我发布了如何使用SQL参数 – 2013-03-07 17:07:16

+0

根据您的建议,我实际上已经将它们一起移动到使用'command.Parameters.Add'准备好的查询中;但是当我看着你的例子(感谢你的帮助)时,我想知道这是做插入的最好方法吗? – Andrew 2013-03-07 17:43:00

3

我建立使用您的代码示例中,这答案。采取以下行注:

cmd.Parameters.AddWithValue("@queryParam", Query); 

它始终是一个最佳实践,以代码为潜在的SQL注入攻击即使他们是不可能发生的

static String Server = ""; 
static String Username = ""; 
static String Name = ""; 
static String password = ""; 

static String conString = "SERVER=" + Server + ";DATABASE=" + Name + ";UID=" + Username + ";PASSWORD=" + password + ";connect timeout=500000;Compress=true;"; 

public bool InsertSQL(String Query) 
{ 
    int tmp = 0; 
    try 
    { 
     using (MySqlConnection mycon = new MySqlConnection(conString)) 
     { 
     using (MySqlCommand cmd = new MySqlCommand(Query, mycon)) 
     { 
      mycon.Open(); 
      try 
      { 
       cmd.Parameters.AddWithValue("@queryParam", Query); 
       tmp = cmd.ExecuteNonQuery(); 
      } 

      catch 
      { 
       if (mycon.State == ConnectionState.Open) 
       { 
        mycon.Close(); 
       } 
      } 
      mycon.Close(); 
     } 
    } 
} 
catch { return tmp > 0 == true ? true : false; } 
return tmp > 0 == true ? true : false; 
}