2013-03-07 245 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; 
}