2011-11-30 82 views
0

我目前正在C#中修补系统,我遇到了一个小并发症。我正在使用MySQL来存储我的更新列表的存档。然后,修补系统检测程序的版本,并在该版本之后下载每个修补程序。虽然我刚刚开始学习如何在C#中使用MySQL,所以我不知道该怎么做,或者调用了很多所需的函数。我想要做的是使用foreach来调用“版本”列/行中的所有值,然后使用while循环来检查当前版本和新版本,直到它们相同。我似乎无法弄清楚如何将两者结合在一起,并找不到任何参考。C#Foreach with MySQL

using (SqlCon = new MySqlConnection(connString)) 
{ 
    SqlCon.Open(); 
    string command = "SELECT * FROM version ORDER BY version"; 
    MySqlCommand GetLatestVersion = new MySqlCommand(command, SqlCon); 

    using (MySqlDataReader DR = GetLatestVersion.ExecuteReader()) 
    { 
     while (DR.Read()) 
     { 
      foreach(DataTable i in DR) 
      { 
       while(v1 < v2) 
       { 
        string LatestVersion = Convert.ToString(DR.GetValue(1)); 
        string WebURL = Convert.ToString(DR.GetValue(2)); 
        update.DownloadProgressChanged += new DownloadProgressChangedEventHandler(download); 
        update.DownloadFileCompleted += new AsyncCompletedEventHandler(extration); 
        update.DownloadFileAsync(new Uri(WebURL), tempFilePath + "patch" + Latest_Version + ".zip"); 
       } 
      } 
     } 
    } 
} 
SqlCon.Close(); 

我将不胜感激任何帮助。

回答

0

首先,你不需要在最后SqlCon.Close();。在using块的末尾处理对象(using块的点)。

您可以修改您的select语句以仅选择大于您程序当前版本的版本。这样,所选的任何记录都应该被处理/下载。 (我把下面的SQL语句中引号的版本,因为你的代码表明它是一个字符串。你可能会更好过指定该值作为数字进行排序/比较的目的,虽然)。

//for readability, I changed the variable name to myProgramsVersion 

using (SqlCon = new MySqlConnection(connString)) 
{ 
    SqlCon.Open(); 
    string command = "SELECT * FROM version where version > '" + myProgramsVersion + "' ORDER BY version"; 
    MySqlCommand GetLatestVersion = new MySqlCommand(command, SqlCon); 

    using (MySqlDataReader DR = GetLatestVersion.ExecuteReader()) 
    { 
     while (DR.Read()) 
     { 
      string LatestVersion = Convert.ToString(DR.GetValue(1)); 
      string WebURL = Convert.ToString(DR.GetValue(2)); 
      update.DownloadProgressChanged += new DownloadProgressChangedEventHandler(download); 
      update.DownloadFileCompleted += new AsyncCompletedEventHandler(extration); 
      update.DownloadFileAsync(new Uri(WebURL), tempFilePath + "patch" + Latest_Version + ".zip"); 
     } 
    } 
} 
+0

其实我从来没有曾尝试在sql查询中使用大于或小于符号。我不知道这是可能的,或者我会这样做,而不是试图做for循环。我正在使用程序集版本来检查数据库。我打算使用文件版本,但是当我尝试它说要很长时间才能转换成版本(); 如果你不介意问我,我还有最后一个问题。是否可以检查另一个程序的程序集版本?我发现如何使用FileVersionInfo检查文件版本,但当我无法获得错误的值时,我无能为力 – dpg199200

+0

我假设您正在谈论主要/次要/构建/修订版本号。你可以在数据库中为每个列创建单独的列,然后将它们加载到'Version'对象中,并使用它的'CompareTo()'方法。这将阻止我上面提供的建议(除非你想写一个真正凌乱的SQL语句)。另一种选择是将程序集版本转换为本评论末尾链接的问题中指定的整数。你可以将它存储在数据库中,并在整数上做一个简单的'>'。但正如这个问题所指出的那样,这不是万无一失的。 http://bit.ly/sCyL6 –

+0

啊,好吧,我明白了。现在只需要弄清楚如何让程序一次只处理一件事情。它不断尝试一次处理所有内容。 – dpg199200

3

只是删除内部foreach,你很好去。