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