【问题标题】:MySQL C# Query using MySql.Data.MySqlClient::MySqlCommand string format issueMySQL C# Query using MySql.Data.MySqlClient::MySqlCommand 字符串格式问题
【发布时间】:2019-06-24 06:10:13
【问题描述】:

我认为有 SQL 格式问题是由于我的 sql 查询结构不正确,特别是引号。

        string recordedPassword = SQLReader.RunQuery (
            "SELECT " +
            "Password " +
            "FROM " +
            "players " +
            "WHERE " +
            "Username="+
            "\""+
            username +
            "\""+
            "Password=" +
            "\""+
            password +
            "\"");

我知道双引号是通过在引号前加一个反斜杠使其成为文字字符串字符来完成的,但是当我在调试时查看它时,它仍然显示反斜杠,这让我觉得它不起作用。

我在网上看到一些用户说 mySQL 查询应该使用单引号来定义值,但是在 PhpMyAdmit 上测试查询时,它只接受双引号中的值。

单身

任何帮助将不胜感激。

【问题讨论】:

  • 如果SQLReader 接受参数化查询,则执行此操作。
  • Anthony's 中的撇号破坏了您的单引号版本。

标签: c# mysql database apache xampp


【解决方案1】:

这里有几件事需要解决/审查

您可以在 C# 中通过在多行字符串前加上 @: 来使多行字符串更具可读性

string sql = @"SELECT *
  FROM table
  WHERE field = value";

这会停止“不断换行”错误,以及使其他一些事情不需要使用反斜杠进行 \escaping。因为现在允许搅拌包含换行符,所以您不必一直停止并以“”+“”+“”开头,所以它看起来不那么混乱。它确实禁用了诸如能够将 \n 用于换行符之类的功能,因为 \ 只是被视为普通字符。因此,它也使 Windows 路径更易于键入(@"C:​​\temp" 与 "C:\temp"。SQL 不关心空格,因此您可以随意缩进 C#

也就是说,您最好将 SQL 字符串放在资源/设置文件中,或者甚至全力以赴并使用实体框架之类的数据访问库,这样您就根本不用在字符串中编写 SQL

始终参数化您的语句。如果你不打算使用 EF 或类似的(它将为你参数化),你绝对应该至少使用:

string sql = @"SELECT * FROM players WHERE username = @u and password = @p";

稍后,在 SqlCommand(或其他)上设置参数值,使 @u 的值为“Anthony”,@p 的值为“Anthony 的密码”。永远不要像您在此处所做的那样通过连接在一起来构建 SQL 字符串 - 一旦有人使用撇号,这不仅是一个错误风险,而且是一个安全风险。请参阅http://bobby-tables.com 了解更多信息

大多数数据库供应商使用撇号 ' 来开始和结束字符串,而不是双引号 "。MySQL 可能是一个例外,但请尝试遵循约定而不是学习专有的 SQL 语法。SQL 不像 javascript,两者都" 和 ' 表示“字符串”,您“使用任何一个允许您拥有包含另一个值的值”,例如 "Antony's password"'she said "yes" already'

在 SQL 中,如果您想在字符串中添加撇号,通常将其加倍:WHERE password = 'Anthony''s password' 但您使用参数(始终使用参数)您不必这样做

【讨论】:

  • 啊,是的,现在开始工作了。使用 SQLParameters 和 StringBuilder 就可以了。干杯!
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2023-01-12
  • 2013-05-13
  • 2018-11-07
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多