2016-12-01 44 views
1

我已经创建了一个程序来监视我公司的项目进度,但是当我正在测试时,我遇到了一个非常棒的问题。当我在PC上测试它在窗口10它创建了一切运行如预期。然而,当我在运行Windows 7的和我得到的SQL查询代码以下错误我的同事的电脑测试“您的SQL语法错误,检查手册,该手册对应于您的MySQL服务器版本的正确语法使用near'01其中teammember.Name =“SomeName”和项目=“SomeProject”在第1行“。导致错误的代码如下所示。只有在其他机器上的MySQL错误语法

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下,程序完美工作,语法看起来正确。任何关于什么可能导致问题的想法?

+0

那么你可以在错误dump出来的命令,所以你可以看到正在发生什么SQL - 参数一个强大的优良选择,不应该被忽略.. – BugFinder

+2

我不是一个MySQL类型的家伙,但我怀疑双引号迁徙案例问题(结果应该看起来像'where teammember.Name ='SomeName'and projects ='SomeProject'') – nozzleman

+0

您应该为查询使用参数。 –

回答

2

使用Command.Parameters写下您的查询。还可以使用@连接多行上的字符串。 格式您的查询!

优点:

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

我想你可以很容易地看到良好的格式和使用参数之间的区别。我建议你写成员,项目的表名,这将更容易理解这个字段的位置。

+0

我改变了你的建议,这已经解决了我最初的问题,但现在我得到了_“列数没有太大的价值在第1行计数”_这是奇怪的,因为再次在**我的电脑**它运行得很好。 – Raftos

+0

@Raftos http://stackoverflow.com/questions/7557307/error-1136-column-count-doesnt-match-value-count-at-row-1从这个答案的建议是有一些触发器(我想它是不是这个),或者你尝试设置HoursWorkedOnProject的值超过列长度 – mybirthname

+0

我还测试了两台机器上要执行的查询,它们是相同的。最让我感到困扰的是,我有类似的代码,可以在所有机器上正常工作。 – Raftos

0

尽量避免双引号序列(逃逸)使用适当alternance用单引号

"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(); 
0

我设法解决了最后的问题。我的电脑使用英文Windows,但我的同事都使用我们的母语使用Widndows。在我国,十进制数字是用逗号(例子0,0)写成的,但在我们的小数点中写有一个点(例如0.0),所以当其他数据发送数据到数据库时它是错误的。要解决我改变了Thread.CurrentThread.CurrentCulture新的CultureInfo问题(“EN-US”)