无法使用 c#“第 1 行的 SQL 语法错误”将数据从 Ms Access 迁移到 MySQL 工作台

Posted

技术标签:

【中文标题】无法使用 c#“第 1 行的 SQL 语法错误”将数据从 Ms Access 迁移到 MySQL 工作台【英文标题】:Unable to migrate data from Ms Access to MySQL workbench using c# "SQL syntax error at Line 1" 【发布时间】:2019-07-28 22:48:07 【问题描述】:

我这几天一直在尝试解决这个异常,但没有找到它。我目前正在尝试使用 C# 应用程序将数据从 MS Access 传输到 mysql 工作台

此行弹出如下错误

myCmd.ExecuteNonQuery();

除了说

"您的 SQL 语法有错误,请找到正确的语法来使用 'V REG 附近。 5V, 0.5A','','Yusuf','',''),('QFN','N230285000','Component','80','Storage' at line 1"

以下是发生错误的代码。任何建议将不胜感激

private void InsertDatatoTable(DataTable dt_Tbl)
    
        MySqlConnection mConnection = null;
        try
        
            string currenttime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");                
            StringBuilder sCommand = new StringBuilder("REPLACE INTO `inventorysystem` (`Product_Name`,`Product_ID`,`Product_Category`,`Quantity`,`Location`,`Manufacturer`,`Project _Name`,`Description`,`MinQuantity`,`Owner`,`QR_Code`,`Color_Type`) VALUES ");
            using (mConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["Data_store"].ToString()))  
            
                List<string> Rows = new List<string>();

                for (int i = 0; i < dt_Tbl.Rows.Count; i++)
                
                    Rows.Add(string.Format("('0','1','2','3','4','5','6','7','8','9','10','11')", dt_Tbl.Rows[i][0].ToString(), dt_Tbl.Rows[i][1].ToString(), dt_Tbl.Rows[i][2].ToString(), dt_Tbl.Rows[i][3].ToString(), dt_Tbl.Rows[i][4].ToString(), dt_Tbl.Rows[i][5].ToString(),
                        dt_Tbl.Rows[i][6].ToString(), dt_Tbl.Rows[i][7].ToString(), dt_Tbl.Rows[i][8].ToString(), dt_Tbl.Rows[i][9].ToString(), dt_Tbl.Rows[i][10].ToString(), dt_Tbl.Rows[i][11].ToString(), currenttime));
                
                sCommand.Append(string.Join(",", Rows));
                sCommand.Append(";");
                mConnection.Open();
                using (MySqlCommand myCmd = new MySqlCommand(sCommand.ToString(), mConnection))
                
                    myCmd.CommandType = CommandType.Text;
                    myCmd.ExecuteNonQuery();
                

【问题讨论】:

也许从删除 SQL 语句前半部分的撇号开始。 那么您尝试过什么来调试此错误?错误很明显,SQL 有问题。在构建字符串后,您检查过sCommand 的值吗?您是否已验证 SQL 语法是否有效?代码讲述了一些故事,但是当 SQL 字符串应该讲述故事并使任何错误更加明显时,这将非常复杂。作为问题的一部分,这就是您应该查看和/或分享的内容。 @June7,感谢您的回复,撇号实际上是我在搜索另一个错误时发现的一个反勾号,因为某些数据在单词之间有空格 表格和字段名称不需要撇号(或反引号)分隔符。如果名称包含空格或标点符号/特殊字符(下划线除外),则使用 [ ] 来分隔名称。数据是否有空格无关紧要。此外,Project _Name 中似乎有一个不应存在的空间。而且 SQL 无论如何都无法识别反勾号。 @CPerkins ,我是 MySQL 新手,所以我不确定我用于调试的方法是否正确。我在 C# 中使用断点 【参考方案1】:

评论证实了我想问的怀疑。包含撇号 (O'Hare) 或引号 (sand at 5" depth) 的数据将导致代码中构造的 SQL 查询语句失败。这不是严格意义上的 C# 问题。用任何语言构建的查询语句都必须处理这个问题。在 VBA 中,使用 Replace 函数将撇号加倍,这会强制 SQL 引擎将其视为实际文本,而不是特殊字符(称为“转义”特殊字符)。示例:

strSQL = "INSERT INTO tablename(fieldname) VALUES('" &amp; Replace(Me.tbxLName, "'", "''") &amp; "')"

引号字符比较棘手。太棘手了,当我第一次遇到这个问题时,我放弃了并指示我的用户不要使用引号字符。从那以后我学会了如何处理。

Replace(Me.tbxComment, Chr(34), Chr(34) &amp; Chr(34))

我认为 C# 中会有类似的功能。

【讨论】:

以上是关于无法使用 c#“第 1 行的 SQL 语法错误”将数据从 Ms Access 迁移到 MySQL 工作台的主要内容,如果未能解决你的问题,请参考以下文章

c#无法将文本附加到现有文件[关闭]

VSCode .editorconfig 无法将设置应用于 C# 代码

无法将 DateTime 从 SQL Server 转换为 C# DateTime

C# 无法使用 Kafka 主题的消息?

我无法使用 C# 添加数据以访问 2007,任何人都可以帮助我吗?

使用 CSVhelper 将单个列更新为先前编写的 CSV 文件。我有 Java 代码,但无法将其翻译成 C#