【问题标题】:Path Stored in database is not right存储在数据库中的路径不正确
【发布时间】:2013-02-01 11:46:38
【问题描述】:
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”值时.. msgbox 显示恰到好处..

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

为什么会这样呢?

【问题讨论】:

  • 路径中的反斜杠 = 需要转义。
  • 对于初学者来说,Windows 不使用正斜杠作为本地文件路径。
  • 是的,Windows 确实使用正斜杠(以及反斜杠)。从命令提示符尝试使用,例如,CD "C:/Program Files"
  • 是的,反斜杠..那我该如何解决呢?

标签: c# mysql winforms


【解决方案1】:

也许 MySQL 认为 "\" 字符是一个转义字符,所以这就是它不包含在字符串中的原因。试试

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

当你插入时,转义字符会被转义。

编辑:例如,像这样替换命令文本初始化行。还为单引号添加转义。

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

编辑:使用参数化查询,请参阅@Matthew 的答案以获得更“最佳实践”的解决方案。

【讨论】:

  • 尝试用string c = openFileDialog1.FileName.Replace(@"\", @"\\");替换这一行,string c = openFileDialog1.FileName;
  • 是的,例如那里。但我的意思是当您形成插入查询并添加“... + c + ...”连接时。
  • 希望您的文件名中没有单引号。
【解决方案2】:

这是由于您编写查询的方式所致。在 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,但希望如果它不起作用,它至少应该为您提供一些有关如何解决此问题的信息。

【讨论】:

  • 这个东西也解决了我的问题,没有使用上面的 c.Replace :)
【解决方案3】:

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

通常,它看起来像这样:

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

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

自从我编写任何明确的 C# 查询代码(6 个月左右)以来已经足够长了,我不记得这是否完全正确,而且我知道 MySql 提供程序使用的参数化约定与 MSSQL 略有不同命名参数(使用@path 而不是?path),但这应该让你走上正确的道路。请参阅 C# MySqlParameter problem 了解更多可能与您相关的指导。

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 2011-08-09
    • 1970-01-01
    • 2020-11-12
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    相关资源
    最近更新 更多