CSDN博客

img tianykun

vc.net2005+access实现天气预报。

发表于2008/9/29 10:24:00  534人阅读

在vc.net 2005,用托管类的实现了天气预报的程序。作为工作以来的第一个程序,做的很认真,从什么都不清楚,到后面都算是对VS有一定的了解。

在本程序中,参考问天网的的天气预报的数据,当给出了问天网当中的城市天气预报的URL后,通过vc.net下的HttpWebRequest连接上,得到了网页的源代码,利用正则表达式,去掉所有的标签,以及标签的内容,剩下的就只有天气预报的数据,包括:今天的,明天的,后天的,最后将这些数据拆分,分别的写入到数据库当中,存档。

程序的运行效果如下:

下面具体的描述程序的步骤,以及源代码的公开:

1.首先是将自己的程序连接到网络,这个通过托管类的vc.net下的httpwebresquest来实现,只要给出了源代码,就可以将网页的源代码拉下来,这个只有几行代码就可以实现了,只要是微软做的好啊:

/////////////////////////////////////////function连接URL,给出网页的源代码////////////////////////////////////////
  String^callURL(int i)
{
 try
 {
 ////////////////////////////////////////解析网页,给出URL,得到源代码////////////////////////
 HttpWebRequest^ request = dynamic_cast<HttpWebRequest^>(WebRequest::Create("http://weather.china.com.cn/city/s"+comboBox1->SelectedValue+"_"+ i +".html " ));
   // Set some reasonable limits on resources used by this request
   //request->MaximumAutomaticRedirections = 4;//获取或设置请求将跟随的重定向的最大数目
  // request->MaximumResponseHeadersLength = 4;//响应标题的长度,以 KB(1024 字节)为单位
  
   // Set credentials to use for this request.
   request->Credentials = CredentialCache::DefaultCredentials;//获取应用程序的系统凭据。
   // Get the response.
   HttpWebResponse^ response = dynamic_cast<HttpWebResponse^>(request->GetResponse());
 
   ////////////////haveresponse/////////////////////////判断连接是否异常//////////////////////////////////////////////
static int res;///////////////////////////////////////判断连接的次数
   if(request->HaveResponse)
   {
    res=0;
      // Get the stream associated with the response.
     Stream^ receiveStream = response->GetResponseStream();
  
   // Pipes the stream to a higher level stream reader with the required encoding format.
     StreamReader^ readStream = gcnew StreamReader( receiveStream,Encoding::UTF8 );

  //开始读取源代码,并显示在text当中
    String^ responseFromServer = readStream->ReadToEnd();
  ///////////////////////////////////////////////////////////////responseFromServer为源代码
 
    response->Close();
    readStream->Close();
    return responseFromServer ;
   }

  else
    if (res<3)
     {   res=res+1;
     MessageBox::Show("不能连接到服务器,请重新连接","提示",MessageBoxButtons::OK,MessageBoxIcon::Error);
    
      }
 else
   {
        MessageBox::Show("不能连接到服务器,程序将退出");
  this->Close();
   } 
 }
 catch(WebException^ e )
 {
    MessageBox::Show("不能连接到服务器");
    this->Close();
 }
}


//////////////////////////////////////////////结束//////////////////////////////////////////////////////////////

2.当得到了源代码后,就要对源代码做正则表达式,去掉所有的标签,剩下的就是数据,

////////////////////////////function解析源代码,剩下天气预报的数据//////////////////////////////////////////////////////
 array<String^>^jiexi(String^responsetext)
 {
  try{
      System::String ^wordsOnly;
              Regex ^objRegExp = gcnew Regex("<(.|/n)+?>");
     System::String^strOutput = objRegExp->Replace(responsetext, "");
              strOutput = strOutput->Replace("<", "&lt;");
              strOutput = strOutput->Replace(">", "&gt;");
           ////////////////////strOutput为要输出的解析源代码后,只剩下数据的字符串
            //把所有空格变为一个空格
            Regex ^r = gcnew Regex("[//s]+");
            wordsOnly = r->Replace(strOutput, " ");
            wordsOnly->Trim();
            //////////////////////////////wordsOnly,为只剩下一个字符串的数据,每个数字之间只相隔一个空格
   //使用split函数,以空格作为分隔符
            array<String^>^ words=wordsOnly->Split(' ');
   return words;////////////////////////////////////////////////返回的含有天气预报的数据,惠州 35-27 多云 风力
  }
  catch(Exception^ e)
  {
    
      MessageBox::Show("连接出现异常,请返回","错误提示",MessageBoxButtons::OK,MessageBoxIcon::Error);
  }
    
  }
 ///////////////////////////////////////结束///////////////////////////////////////////////////////////////////////////

3.拆分得到的数据,取得最小的项:

array<String^>^shuzi(String^responsetext)
  {      try{
              Regex ^objRegExp = gcnew Regex("<(.|/n)+?>");
     System::String^strOutput = objRegExp->Replace(responsetext, "");
              strOutput = strOutput->Replace("<", "&lt;");
              strOutput = strOutput->Replace(">", "&gt;");
////////////只显示数字,/////

   System::String ^wordnum;///////////只显示数字
            Regex ^rr = gcnew Regex("//D+");
            wordnum = rr->Replace(strOutput, " ");
            wordnum->Trim();
            //////////////////////// wordnum,为只显示数字的字符串数据,
          //使用split函数,以空格作为分隔符
            array<String^>^ wordss=wordnum->Split(' ');
   return wordss;///////////////////////////////////////////////////////////////////返回的只有数字,32-27
             }
       catch(Exception^ e)
  {
    
      MessageBox::Show("连接出现异常,请返回","错误提示",MessageBoxButtons::OK,MessageBoxIcon::Error);
  }
       
   }

4.最后是入数据库,判断是否原先有这个日期的城市的天气预报,如果没有就直接插入,如果有,就更新:

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
///////////////////////////////////////////////更新数据库,当有数据,则更新数据库,没这个数据,则插入到数据库/////////

           String ^strCon ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C://weather_report.mdb";
     String ^str1 = comboBox1->SelectedValue->ToString();
           //查询数据库
     String ^strComSel =  "select count(*) from weather where city_id = '"+str1+"'";
///////update数据库
     String ^strComUpd =  "update weather SET Today = '" + textBox4->Text + "',city_name = '" + textBox3->Text +
      "',weatherToday ='" + textBox5->Text +"',Htemp = '" + textBox9->Text + "',Ltemp = '" + textBox10->Text +
      "',windD ='" + textBox6->Text +"',GorL = '" + textBox7->Text + "',Nwind = '" + textBox8->Text +
      "',Tweather ='" + textBox2->Text +"',THtemp = '" + textBox12->Text + "',TLtemp = '" + textBox13->Text +
      "',TwindD ='" + textBox11->Text + "',TGorL = '" + textBox14->Text + "',TNwind = '" + textBox15->Text +
      "',Aweather ='" + textBox16->Text +"',AHtemp = '" + textBox18->Text + "',ALtemp = '" + textBox19->Text +
      "',AwindD ='" + textBox17->Text +  "',AGorL = '" + textBox20->Text + "',ANwind = '" + textBox21->Text +
      "' where city_id ='" + str1 +"'";

//insert into 数据库
     String ^strComIns =  "INSERT INTO weather(city_id,Today,city_name,weatherToday,Htemp,Ltemp,windD,GorL,Nwind,Tweather,"+
                       "THtemp,TLtemp,TwindD,TGorL,TNwind,Aweather,AHtemp,ALtemp,AwindD,AGorL,ANwind) "+
                   "VALUES( '" + str1 + "','" + textBox4->Text + "','" +textBox3->Text+"','"+textBox5->Text+
       "','" + textBox9->Text + "','" + textBox10->Text + "','"+textBox6->Text+"','"+textBox7->Text+
       "','" + textBox8->Text + "','" + textBox2->Text + "','" +textBox12->Text+"','"+textBox13->Text+
       "','" + textBox11->Text + "','" + textBox14->Text + "','" + textBox15->Text + "','" + textBox16->Text +
       "','" +textBox18->Text+"','"+textBox19->Text+"','" + textBox17->Text + "','"+ textBox20->Text +
       "','" + textBox21->Text + "')";
///////////创建命令
   OleDbConnection^ myConn = gcnew OleDbConnection(strCon);
   OleDbCommand ^myCommadSel = gcnew OleDbCommand(strComSel);
   OleDbCommand ^myCommadUpd = gcnew OleDbCommand(strComUpd);
   OleDbCommand ^myCommadIns = gcnew OleDbCommand(strComIns);
///////将各个命令连接起来
   myCommadSel->Connection = myConn;
   myCommadUpd->Connection = myConn;
   myCommadIns->Connection = myConn;
        try
   {
    myConn->Open();
    //返回0,则说明没有这样的数据,选择插入到数据库
    Int32 integer = (Int32)myCommadSel ->ExecuteScalar();

    if(integer == 0)
    {
     ////执行命令
     myCommadIns ->ExecuteNonQuery();
     MessageBox::Show("新的数据已经加入到数据库中!"); 
    }
    else
    {
                     //在原先有的数据上,更新数据。
     ////执行命令
     myCommadUpd ->ExecuteNonQuery();
     MessageBox::Show("原先的数据已被更新!");
                    integer = 0;
    }
   }
  catch(Exception^ e)
   {
    MessageBox::Show("数据库操作失败,请返回","错误提示",MessageBoxButtons::OK,MessageBoxIcon::Error);
   }
  finally
   {
                myConn->Close();

   }
}
//////////////////////////

 

0 0

相关博文

我的热门文章

img
取 消
img