数据库中存储的路径不正确

本文关键字:路径 不正确 存储 数据库 | 更新日期: 2023-09-27 17:59:54

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(。

但当我用这个代码检查"sr"值时。。消息框显示得恰到好处。。

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

为什么会这样?

数据库中存储的路径不正确

也许MySQL认为"''"字符是一个转义符,所以它不在字符串中包含它。尝试

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

插入时,转义符将被转义。

EDIT:例如,替换命令文本初始化行,如下所示。还要为单引号添加转义符。

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

编辑:请参阅@Matthew的回答,了解使用参数化查询的更"最佳实践"的解决方案。

这是由于编写查询的方式造成的。在MySQL中,反斜杠字符'(存在于文件路径中(具有特殊含义,即转义下一个字符。您需要对这些进行编码,许多不同的DBMS都有这样的模式。

除此之外,您的代码容易受到SQL注入的影响。

要解决这两个问题,可以使用参数化查询。

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,但希望如果它不起作用,它至少应该给你一些关于如何解决这个问题的信息。

为什么不使用参数化查询?您可以避免转义字符串的大部分麻烦,防止一整类安全风险,并从查询缓存中获得一点点性能

通常情况下,它看起来像这样:

cmd.CommandText = "INSERT INTO data (path) values(?path)";
cmd.Prepare();
cmd.Parameters.AddWithValue("?path", c);

我已经很久没有写过任何明确的C#查询代码了(6个月左右(,我不记得这是否正确,我知道MySql提供程序对命名参数使用了与MSSQL略有不同的参数化约定(使用@path而不是?path(,但这应该会让你走上正确的道路。请参阅C#MySqlParameter问题,以获得更多可能与您相关的指导。