2013-02-16 96 views
3
private void button14_Click(object sender, EventArgs e) 
     { 
      if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
        string c = openFileDialog1.FileName; 

        string connString = "Server=Localhost;Database=test;Uid=root;password=root;"; 
        MySqlConnection conn = new MySqlConnection(connString); 
        MySqlCommand command = conn.CreateCommand(); 
        command.CommandText = ("Insert into data (path) values('" + c + "')"); 
        conn.Open(); 
        command.ExecuteNonQuery(); 
        conn.Close(); 
        MessageBox.Show("Success"); 
       } 
      } 

此代碼對我的作品,但不幸的是,存儲在數據庫中的路徑是不正確的..保存的路徑是這樣的(C:Users hesisDesktopREDEFENSEResourcesImagesRED1f.png),它應該是這樣的(C:P/Users/thesis/Desktop..../1f.png )。路徑在數據庫中的存儲是不正確的

但是,當我檢查這個代碼..的MSGBOX表演恰到好處的「SR」價值..

private void button14_Click(object sender, EventArgs e) 
{ 
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
    {   
     MessageBox.Show(openFileDialog1.FileName); 
    } 
} 

爲什麼它那麼發生?

+0

這是路徑中的反斜槓=它們需要被轉義。 – 2013-02-16 16:54:49

+0

對於初學者,Windows不使用正斜槓作爲本地文件路徑。 – 2013-02-16 16:54:51

+0

是的,Windows確實使用了正斜槓(以及反斜槓)。嘗試從命令提示符使用,例如,CD「C:/ Program Files」 – 2013-02-16 16:55:14

回答

5

也許MySQL認爲「\」字符是一個轉義,所以這就是爲什麼它不包含在字符串中。嘗試

c.Replace(@"\", @"\\") 

當您插入時,所以轉義字符將被轉義。

編輯:例如,替換像這樣的命令文本初始化線。另外爲單引號添加一個轉義。

string escapedPath = c.Replace(@"\", @"\\").Replace("'", @"\'");  
command.CommandText = ("Insert into data (path) values('" + escapedPath + "')"); 

編輯:請參閱@馬修的答案爲甚至更多的「最佳實踐」解決方案,使用參數化查詢。

+0

所以我應該把這個c.Replace放在我的代碼中?謝謝btw .. – 2013-02-16 17:01:03

+0

嘗試用'string c = openFileDialog1.FileName.Replace(@「\」,@「\\」);'替換這一行,'string c = openFileDialog1.FileName;'。 – Jesse 2013-02-16 17:02:31

+0

是的,例如那裏。但我的意思是當你形成插入查詢並添加「... + c + ...」串聯。 – 2013-02-16 17:03:53

3

這是由於您編寫查詢的方式。在MySQL中,反斜線字符\(它存在於文件路徑中)具有特殊含義,用於轉義下一個字符。您需要對這些進行編碼,許多不同的DBMS都有模式來執行此操作。

除此之外,您的代碼易受SQL injection影響。

要解決這兩個問題,可以使用參數化查詢。

public void InsertPath(string path) 
{ 
    string connString = "Server=Localhost;Database=test;Uid=root;password=root;"; 

    using (var connection = new MySqlConnection(connString)) 
    { 
     connection.Open(); 

     using (var command = connection.CreateCommand()) 
     { 
      command.CommandText = "INSERT INTO data(path) VALUES(?path)"; 

      command.Parameters.AddWithValue("?path", path); 

      command.ExecuteNonQuery(); 
     } 
    } 
} 

這個答案可能不是100%準確,因爲我沒有MySQL的我的電腦上,但我希望,如果它不能正常工作,它至少應該給你如何處理這個問題的一些信息。

+0

感謝告訴我這一點,得到解決我的代碼:) – 2013-02-16 17:08:45

+0

這個東西也解決我的問題,而不使用c.Replace上面:) – 2013-02-16 17:30:45

0

爲什麼不使用參數化查詢?您可以避免大部分轉義字符串的麻煩,防止一整套安全風險,並且如果這樣做可以從查詢緩存中獲得一點性能。

通常情況下,它看起來是這樣的:

cmd.CommandText = "INSERT INTO data (path) values(?path)"; 

cmd.Prepare(); 
cmd.Parameters.AddWithValue("?path", c); 

它已經足夠長的時間,因爲我寫的任何顯式的C#查詢代碼(6個月左右),我不記得,如果這是完全正確的,並且我知道MySql提供程序對命名參數(它使用@path而不是?路徑)使用與MSSQL稍有不同的參數化約定,但是這應該讓您處於正確的路徑。請參閱C# MySqlParameter problem瞭解更多可能與您有關的指導。

相關問題