2016-12-01 5 views
1

私は自分の会社のプロジェクトの進捗状況を監視するプログラムを作成しましたが、私はテスト中ですので、非常にうんざりな問題に直面しています。私がの下にWindows 10の下でテストすると、すべてが作成されたは、期待通りにを実行します。しかし、私は窓7と私はそのマニュアルを確認し、「あなたは、あなたのSQL構文でエラーが発生しているSQLクエリのコードで、次のエラーを取得を実行し、私の同僚のコンピュータでそれをテストするとき右側の構文が'01 near'01を使用するためのMySQLサーバのバージョンに対応します。ここで、teammember.Name = "SomeName"およびprojects = "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

を変更しました偉大な良い選択と無視すべきではありません.. – BugFinder

+2

私は男のMySQLのタイプではないが、私は二重引用符migthケースの問題(結果は 'のようになります' teammember.Name = 'SomeName'とprojects = 'SomeProject'' – nozzleman

+0

クエリにパラメータを使用する必要があります。 –

答えて

2

単一引用符で適切オルタナンスを使用して二重引用符シーケンスを避ける(とエスケープ)試してみてください。また、@を使用して複数の行に文字列を連結します。 フォーマットあなたのお問い合わせ

利点:発生しません。このような

1)問題

2)あなたが書かれたコードが読み取られた

3)SQLインジェクション/から保護されてい

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

Command.Parametersを使用して、クエリを書く

"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を母語で使用しています。私の国では10進数はカンマ(例0,0)を使って書かれていますが、10進数はドット(例0.0)で書かれています。パラメータがある - 問題を修正するには私はあなたが生成されているものをSQL見ることができるようにさてあなたはエラーでコマンドをダンプできThread.CurrentThread.CurrentCultureに新しいのCultureInfo(「EN-US」)

関連する問題