首页 > 解决方案 > MySQL C# Query using MySql.Data.MySqlClient::MySqlCommand 字符串格式问题

问题描述

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

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

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

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

双倍的

在此处输入图像描述

单身的

在此处输入图像描述

任何帮助将不胜感激。

标签: c#mysqldatabaseapachexampp

解决方案


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

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

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

这将停止“不断换行”错误,以及使其他一些事情不需要使用反斜杠进行 \escaping。因为stirng现在允许包含换行符,所以你不必一直停止并以“”+“”+“”开始,所以它看起来不那么凌乱。它确实禁用了诸如能够将 \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'但是在使用参数(始终使用参数)时,您不必这样做


推荐阅读