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);
}
}
为什么会发生呢?
答案 0 :(得分:5)
也许MySQL认为“\”字符是一个转义符,所以这就是它在字符串中不包含它的原因。试试
c.Replace(@"\", @"\\")
插入时,转义字符将被转义。
编辑:例如,像这样替换命令文本初始化行。还为单引号添加转义。
string escapedPath = c.Replace(@"\", @"\\").Replace("'", @"\'");
command.CommandText = ("Insert into data (path) values('" + escapedPath + "')");
编辑:请参阅@ Matthew的回答,了解更多“最佳实践”解决方案,使用参数化查询。
答案 1 :(得分: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,但希望如果它不起作用,它至少应该给你一些关于如何处理这个问题的信息
答案 2 :(得分:0)
为什么不使用参数化查询?您可以避免大部分转义字符串的麻烦,防止出现整类安全风险,并从查询缓存中获得一点点性能。
通常,它看起来像这样:
cmd.CommandText = "INSERT INTO data (path) values(?path)";
cmd.Prepare();
cmd.Parameters.AddWithValue("?path", c);
由于我已经编写了任何明确的C#查询代码(大约6个月左右),我已经记不清它是否完全正确,我知道MySql提供程序使用的参数化约定略微不同于MSSQL命名参数(使用@path而不是?path),但这应该让你走在正确的道路上。请参阅C# MySqlParameter problem以获取可能与您相关的更多指导。