繁体   English   中英

在MySQL中插入许多列时的语法错误

[英]Syntax error when inserting many columns into MySQL

我正在尝试使用下面的C#代码将一些数据插入MySQL数据库。 如果我运行此命令,它将引发如下异常:

some error: You have an error in your SQL syntax; check the manual that correspo
nds to your MySQL server version for the right syntax to use near ': The Third Reich,
                                ,
                         ' at line 25

某个地方有语法错误吗? 我找不到任何错误。

 var rowContent = String.Format(@"
                            INSERT INTO animes
                            (
                            `JapanTitle`,
                            `AmericanTitle`,
                            `GermanTitle`,
                            `AnimeType`,
                            `CoverPath`,
                            `Episodes`,
                            `MinutesPerEpisodes`,
                            `JapanStatus`,
                            `AmericanStatus`,
                            `GermanStatus`,
                            `JapanTimeSpan`,
                            `AmericanTimeSpan`,
                            `GermanTimeSpan`,
                            `MainGenres`,
                            `SubGenres`,
                            `JapanStudios`,
                            `AmericanStudios`,
                            `GermanStudios`,
                            `GermanDescription`,
                            `EnglishDescription`)
                            VALUES
                            ({0},
                            {1},
                            {2},
                            {3},
                            {4},
                            {5},
                            {6},
                            {7},
                            {8},
                            {9},
                            {10},
                            {11},
                            {12},
                            {13},
                            {14},
                            {15},
                            {16},
                            {17},
                            {18},
                            {19});", entity.JapanTitle,
                                   entity.AmericanTitle,
                                   entity.GermanTitle,
                                   entity.AnimeType.ToString(),
                                   entity.WallPaper.FileName,
                                   entity.Episodes,
                                   entity.MinutesPerEpisode,
                                   entity.JapanStatus.ToString(),
                                   entity.AmericanStatus.ToString(),
                                   entity.GermanStatus.ToString(),
                                   entity.JapanTimeSpan.ToString(),
                                   entity.AmericanTimeSpan.ToString(),
                                   entity.GermanTimeSpan.ToString(),
                                   string.Join(",", entity.MainGenres),
                                   string.Join(",", entity.SubGenres),
                                   string.Join(",", entity.JapanStudios),
                                   string.Join(",", entity.AmericanStudios),
                                   string.Join(",", entity.GermanStudios),
                                   entity.GermanDescription,
                                   entity.EnglishDescription);

如果我看这段代码,我认为这是非常糟糕的代码。 有没有更好的方法可以在没有诸如实体框架之类的数据库中插入许多列?

您的主要错误是由字符串周围的引号引起的。 在sql命令文本中,当您要为文本字段传递值时,需要将此值放在单引号之间。
但是,如果在值周围加上适当的引号,您还会遇到另一个大问题,即Sql Injection

使用这样的命令的唯一安全方法是通过参数化查询
这样的事情(因为太长,我会削减您的代码)

string cmdText = @"INSERT INTO animes
                  (JapanTitle,AmericanTitle,GermanTitle,AnimeType,.....)
                  VALUES(@japtitle, @usatitle, @germantitle, @animtype, ....)";
MySqlCommand cmd = new MySqlCommand(cmdText, connection);
cmd.Parameters.AddWithValue("@japtitle",  entity.JapanTitle);
cmd.Parameters.AddWithValue("@usatitle",  entity.AmericanTitle);
cmd.Parameters.AddWithValue("@germantitle",  entity.GermanTitle);
cmd.Parameters.AddWithValue("@animtype",  entity.AnimeType);
....
cmd.ExecuteNonQuery();

这样,您不会直接在命令文本中写入值,而是在参数值中放置占位符。 数据库引擎将确定如何使用命令中传递的参数。 (无需担心字符串周围的引号或转义为值一部分的引号)

还要注意,Parameters集合的AddWithValue方法具有其自身的怪癖。 您需要传递具有数据库字段期望的确切数据类型的值(因此,如果该字段需要整数,则对于AnimeType来说,没有ToString())

首先,您的数据库应该看起来像这样:

  • 一个animes与像非语言值表CoverPathEpisodes等-每部电影一行
  • animes_lang表,具有特定于语言的值,例如TitleStatusTimeSpanStudios等-每部电影每种语言一行

可能会使维护更容易。

无论如何,我可以简化查询的构造,但是您需要指定所有参数。

String[] cols = {
  "JapanTitle",
  "AmericanTitle",
  "GermanTitle",
  "AnimeType",
  "CoverPath",
  "Episodes",
  "MinutesPerEpisodes",
  "JapanStatus",
  "AmericanStatus",
  "GermanStatus",
  "JapanTimeSpan",
  "AmericanTimeSpan",
  "GermanTimeSpan",
  "MainGenres",
  "SubGenres",
  "JapanStudios",
  "AmericanStudios",
  "GermanStudios",
  "GermanDescription",
  "EnglishDescription"
};

String query =
  "INSERT INTO animes (" + String.Join(", ", cols) +
  ") VALUES (" + String.Join(", @", cols) + ");";

MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@JapanTitle", entity.JapanTitle);
cmd.Parameters.AddWithValue("@AmericanTitle", entity.AmericanTitle);
cmd.Parameters.AddWithValue("@GermanTitle", entity.GermanTitle);
. . .
cmd.Parameters.AddWithValue("@EnglishDescription", entity.EnglishDescription);
cmd.ExecuteNonQuery()

请使用史蒂夫的答案或此答案。 不要走String.Format路线。 可能SQL注入在这里不是问题,但要养成以安全正确的方式执行此操作的习惯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM