C# MySQL仅在其他机器上使用错误语法

C# MySQL仅在其他机器上使用错误语法,c#,mysql,debugging,C#,Mysql,Debugging,我已经为我的公司创建了一个监控项目进度的程序,但在测试过程中,我遇到了一个非常奇怪的问题。当我在电脑的Windows10下测试它时,一切都按预期运行。但是,当我在运行windows 7和8的同事的计算机上测试它时,我在sql查询代码中得到了以下错误“如果您的sql语法有错误,请查看与您的MySQL服务器版本对应的手册,以了解在'01 where teammember.Name=”附近使用的正确语法第1行的SomeName“和projects=“SomeProject”。导致错误的代码如下所示

我已经为我的公司创建了一个监控项目进度的程序,但在测试过程中,我遇到了一个非常奇怪的问题。当我在电脑的Windows10下测试它时,一切都按预期运行。但是,当我在运行windows 78的同事的计算机上测试它时,我在sql查询代码中得到了以下错误“如果您的sql语法有错误,请查看与您的MySQL服务器版本对应的手册,以了解在'01 where teammember.Name=”附近使用的正确语法第1行的SomeName“和projects=“SomeProject”。导致错误的代码如下所示

 public void UpdateHoursWorked(string teamMember, string projectName, float hoursWorked)
        {
            SetSafeUpdates(false);

            // Error HERE
            using (MySqlCommand cmd = new MySqlCommand("update memberprojects " +
                "join teammembers on Member = teammembers.TeamMembersID " +
                "join projects on Project = projects.ProjectsID " +
                "set HoursWorkedOnProject = HoursWorkedOnProject + " + hoursWorked + " " +
                "where teammembers.Name = \"" + teamMember + "\" and projects.ProjectName = \"" + projectName + "\"", conn))
                cmd.ExecuteNonQuery();

            // Update the total hours worked in the projects table, and re-read the projects
            UpdateTotalHoursWorked(projectName, hoursWorked);

            OnUpdate(EventArgs.Empty);
        }

我似乎无法指出问题所在,因为在windows 10下,该程序运行完美,语法在我看来也正确。你知道是什么导致了这个问题吗?

尝试使用单引号的适当替换来避免双引号序列(和转义)

  "update memberprojects " +
  "join teammembers on Member = teammembers.TeamMembersID " +
  "join projects on Project = projects.ProjectsID " +
  "set HoursWorkedOnProject = HoursWorkedOnProject + " + hoursWorked + " " +
  "where teammembers.Name = '" + teamMember + "'  and projects.ProjectName = '" + projectName + "'", conn))
  cmd.ExecuteNonQuery();

使用
命令编写查询。参数
。还可以使用
@
连接多行上的字符串格式化您的查询

好处:

1) 这样的问题不会发生

2) 您受到sql注入的保护

3) 代码更容易读/写

using (MySqlCommand cmd = new MySqlCommand())
{
    cmd.CommandText = @"
                 UPDATE
                     MemberProjects  
                 JOIN 
                     TeamMembers ON Member = TeamMembers.TeamMembersID
                 JOIN 
                     Projects ON Project = Projects.ProjectsID 
                 SET 
                     HoursWorkedOnProject = HoursWorkedOnProject +  @HoursWorked
                 WHERE
                     TeamMembers.Name = @Name AND
                     Projects.ProjectName = @ProjectName";

    cmd.Connection = conn;
    cmd.Parameters.AddWithValue("@HoursWorked", hoursWorked);
    cmd.Parameters.AddWithValue("@Name", teamMember);    
    cmd.Parameters.AddWithValue("@ProjectName", projectName);

    cmd.ExecuteNonQuery();
}

我认为您可以很容易地看到良好格式和使用参数之间的区别。我建议您将表名写在Member Project前面,这样更容易理解此字段的位置。

我设法解决了最后一个问题。我的电脑使用的是英语Windows,但我的同事都使用我们母语的Widnows。在我的国家,十进制数字是用逗号(例如0,0)写的,但在美国,十进制数字是用点(例如0.0)写的,所以当其他电脑向数据库发送数据时,它是错误的。为了解决这个问题,我将Thread.CurrentThread.CurrentCulture更改为new CultureInfo(“en-us”)

您可以在出错时转储命令,以便查看生成的sql-参数是一个非常好的选择,不应该被忽略..我不是MySQL类型的人,但我怀疑双引号可能会引起问题(结果应该类似于
where teammember.Name='SomeName'和projects='SomeProject'
),您应该使用参数进行查询。在这种情况下,我通常会从c#复制字符串,并直接在SQL Server Management Studio中执行查询,该Studio具有更好的错误消息。我怀疑像BugFinder说的那样,它将使用参数进行修复。当您不使用参数时,驱动程序必须猜测数据的类型,并且经常猜错。就像在excel中,excel猜测并将数字更改为日期,将日期更改为数字一样。谢谢各位,我明天早上会检查你们的建议,希望我能解决这个问题。我将代码更改为您建议的代码,这解决了我最初遇到的问题,但现在我得到了“第1行的列计数没有太多值计数”这很奇怪,因为在我的计算机中,它运行得很好。@Raftos从这个答案来看,建议是有一些触发器(我想不是这个),或者您尝试设置的HoursWorkedOnProject的值超过了列长度。我还测试了两台计算机中要执行的查询,它们是相同的。最让我头疼的是,我有类似的代码,在所有机器上都能正常工作。@Raftos检查它在其他数据库上的定义HoursWorkedOnProject。有可能超出字段的限制。是的,HoursWorkedOnProject肯定有问题,因为我将其设置为0,查询工作正常。我更仔细地研究它。