将许多列插入MySQL时出现语法错误

时间:2014-12-19 22:53:42

标签: c# mysql syntax

我正在尝试使用下面的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);

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

2 个答案:

答案 0 :(得分:4)

您的主要错误是由字符串周围缺少引号引起的。在sql命令文本中,当您要为文本字段传递值时,需要将此值放在单引号之间。
但是,如果您的值附近有适当的引号,则会出现另一个名为Sql Injection的大问题。

使用这样的命令的唯一安全方法是通过parameterized query 像这样的东西(我会因为太长而剪掉你的代码)

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())

答案 1 :(得分:3)

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

  • 包含animesCoverPath等非语言值的Episodes表格 - 每部电影一行
  • 包含animes_langTitleStatusTimeSpan等语言特定值的Studios表格 - 每部电影每种语言一行< / LI>

可能使维护更容易。

无论如何,我可以使查询构造更容易,但您需要指定所有参数。

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()

请使用Steve的答案或者这个答案。不要走String.Format路线。这可能是SQL注入不是一件令人担心的问题,而是习惯于以安全和正确的方式做到这一点。