MySQL C# 查询使用 MySql.Data.MySqlClient::MySqlCommand 字符串格式问题
MySQL C# Query using MySql.Data.MySqlClient::MySqlCommand string format issue
存在 SQL 格式问题,我认为这是由于我的 sql 查询结构不正确,特别是引号。
string recordedPassword = SQLReader.RunQuery (
"SELECT " +
"Password " +
"FROM " +
"players " +
"WHERE " +
"Username="+
"\""+
username +
"\""+
"Password=" +
"\""+
password +
"\"");
我知道双引号是通过在引号前放置一个反斜杠使其成为文字字符串字符来完成的,但是当我在调试时查看它时它仍然显示反斜杠,这让我认为它不起作用.
我在网上看到很多用户说 mySQL 查询应该使用单引号来定义值,但是在 PhpMyAdmit 上测试查询时它只接受双引号中的值。
双人
单身
如有任何帮助,我们将不胜感激。
address/review 这里有几件事
您可以通过在 C# 中添加前缀 @:
使多行字符串更具可读性
string sql = @"SELECT *
FROM table
WHERE field = value";
这将停止 "newline in constant" 错误,并使其他一些事情不需要使用反斜杠转义。因为现在允许 stirng 包含换行符,所以你不必一直用“”+”“+”“停止和启动它,所以它看起来不那么乱了。它确实禁用了诸如能够使用 \n 作为换行符之类的功能,因为 \ 仅被视为普通字符。因此,它也使 windows 路径更易于键入(@"C:\temp" 与 "C:\temp"。SQL 不关心空格,因此可以根据需要缩进 C#
就是说,您最好将 SQL 字符串放在 resource/settings 文件中,或者甚至全力以赴并使用 entity framework 这样的数据访问库,所以你根本没有在字符串中写 SQL
始终参数化您的语句。如果您不打算使用 EF 或类似工具(将为您参数化),您绝对至少应该使用:
string sql = @"SELECT * FROM players WHERE username = @u and password = @p";
稍后,在您的 SqlCommand(或其他)上设置参数值,使 @u 的值为 "Anthony",@p 的值为 "Anthony's password"。永远不要像您在此处所做的那样通过连接在一起来构建 SQL 字符串 - 一旦有人使用撇号,这不仅会带来错误风险,还会带来安全风险。有关详细信息,请参阅 http://bobby-tables.com
大多数数据库供应商使用撇号 ' 来开始和结束字符串,而不是双引号 "。MySQL 可能是个例外,但请务必尝试遵循约定而不是学习专有的 SQL 语法. SQL 不像 javascript,其中 " 和 ' 都表示 "string" 而你 "use whichever one allows you to have have values containing the other one" 就像 "Antony's password"
或 'she said "yes" already'
在 SQL 中,如果你想在字符串中放置一个撇号,你通常会把它加倍:WHERE password = 'Anthony''s password'
但是你正在使用参数(总是使用参数)你不必须这样做
存在 SQL 格式问题,我认为这是由于我的 sql 查询结构不正确,特别是引号。
string recordedPassword = SQLReader.RunQuery (
"SELECT " +
"Password " +
"FROM " +
"players " +
"WHERE " +
"Username="+
"\""+
username +
"\""+
"Password=" +
"\""+
password +
"\"");
我知道双引号是通过在引号前放置一个反斜杠使其成为文字字符串字符来完成的,但是当我在调试时查看它时它仍然显示反斜杠,这让我认为它不起作用.
我在网上看到很多用户说 mySQL 查询应该使用单引号来定义值,但是在 PhpMyAdmit 上测试查询时它只接受双引号中的值。
双人
单身
如有任何帮助,我们将不胜感激。
address/review 这里有几件事
您可以通过在 C# 中添加前缀 @:
使多行字符串更具可读性string sql = @"SELECT *
FROM table
WHERE field = value";
这将停止 "newline in constant" 错误,并使其他一些事情不需要使用反斜杠转义。因为现在允许 stirng 包含换行符,所以你不必一直用“”+”“+”“停止和启动它,所以它看起来不那么乱了。它确实禁用了诸如能够使用 \n 作为换行符之类的功能,因为 \ 仅被视为普通字符。因此,它也使 windows 路径更易于键入(@"C:\temp" 与 "C:\temp"。SQL 不关心空格,因此可以根据需要缩进 C#
就是说,您最好将 SQL 字符串放在 resource/settings 文件中,或者甚至全力以赴并使用 entity framework 这样的数据访问库,所以你根本没有在字符串中写 SQL
始终参数化您的语句。如果您不打算使用 EF 或类似工具(将为您参数化),您绝对至少应该使用:
string sql = @"SELECT * FROM players WHERE username = @u and password = @p";
稍后,在您的 SqlCommand(或其他)上设置参数值,使 @u 的值为 "Anthony",@p 的值为 "Anthony's password"。永远不要像您在此处所做的那样通过连接在一起来构建 SQL 字符串 - 一旦有人使用撇号,这不仅会带来错误风险,还会带来安全风险。有关详细信息,请参阅 http://bobby-tables.com
大多数数据库供应商使用撇号 ' 来开始和结束字符串,而不是双引号 "。MySQL 可能是个例外,但请务必尝试遵循约定而不是学习专有的 SQL 语法. SQL 不像 javascript,其中 " 和 ' 都表示 "string" 而你 "use whichever one allows you to have have values containing the other one" 就像 "Antony's password"
或 'she said "yes" already'
在 SQL 中,如果你想在字符串中放置一个撇号,你通常会把它加倍:WHERE password = 'Anthony''s password'
但是你正在使用参数(总是使用参数)你不必须这样做