2012-04-18 24 views
0

私のコードはデータベースの変更をチェックし、Webサービス経由でクライアントに更新を送信します。指定されたキャストが有効でない問題

データベースの変更を確認する呼び出しを行うため、クライアントに正常にメッセージを送信する部分がありました。今度は、データベースの変更をチェックする部分を追加しました。次のエラーが発生しています。

私のコードをデバッグするとき、エラーはコードの一番下の例外を指しているので、どこからエラーが発生しているのか、それを修正する方法はわかりません。

どれアドバイスをいただければ幸いです

SendInvUpdate.InvServices.UpdateRatePackagesRequest ur = new SendInvUpdate.InvServices.UpdateRatePackagesRequest(); 
    SendInvUpdate.InvServices.UpdateRatePackagesOperationResponse or = new SendInvUpdate.InvServices.UpdateRatePackagesOperationResponse(); 


    protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      string connStr = ConfigurationManager.ConnectionStrings["bb"].ConnectionString; 
      SqlConnection Con = new SqlConnection(connStr); 
      Con.Open(); 
      SqlCommand cmd = new SqlCommand("invpush_PollForAvailableChanges", Con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      SqlParameter NewSysChangeVersionParam = new SqlParameter("@NewSysChangeVersion", SqlDbType.Int); 
      NewSysChangeVersionParam.Value = (object)NewSysChangeVersionParam ?? DBNull.Value; 
      NewSysChangeVersionParam.Direction = ParameterDirection.InputOutput; 
      NewSysChangeVersionParam.SqlDbType = SqlDbType.BigInt; 
      SqlDataReader sdr = cmd.ExecuteReader(); 

      InventoryPushSubscriptionRecord rec = new InventoryPushSubscriptionRecord(); 

      while (sdr.Read()) 
      { 

       rec.InventoryPushSubId = sdr.GetInt32(0); 
       rec.CMName = sdr.GetString(1); 
       rec.NotifUrl = sdr.GetString(2); 
       rec.Options = sdr.GetString(3); 
       rec.LastSysChangeVersion = sdr.IsDBNull(4)?(long?)null:sdr.GetInt32(4); 

      } 

      if(!sdr.NextResult()) throw new System.Exception("Expected Result set 1 for InventoryChangeRecord"); 
      InventoryChangeRecord inrec = new InventoryChangeRecord(); 
      while (sdr.Read()) 
      { 
       inrec.InventoryPushSubId= sdr.GetInt32(0); 
       inrec.SysChangeVersion=sdr.IsDBNull(1)?(long?)null:sdr.GetInt32(1); 
       inrec.InvDate=sdr.GetDateTime(2); 
       inrec.ResId=sdr.GetInt32(3); 
       inrec.RoomType=sdr.GetString(4); 
       inrec.InvCount=sdr.GetInt32(5); 
       inrec.ResName=sdr.GetString(6); 

      } 

      sdr.Close(); 
      sdr.Dispose(); 

      if (NewSysChangeVersionParam != null) 
      { 
       int ResId; 
       Int64 ResoId; 
       ResortId = inrec.ResId; 
       SqlDataAdapter sda = new SqlDataAdapter("Select BID,RId from BBTest.bbtest.tblResMapping where [email protected]",Con); 
       SqlParameter resId = new SqlParameter("@ResId", ResId); 
       sda.SelectCommand.Parameters.Add(resId); 
       DataSet ds = new DataSet(); 
       sda.Fill(ds, "tblresmapping"); 
       if (ds.Tables[0].Rows.Count > 0) 
       { 
        ResoId = Convert.ToInt32(ds.Tables[0].Rows[0]["ResonlineId"]); 
       } 

       if (ds.Tables[0].Rows.Count != 0) 
       { 
        Int64 RatePackageId; 
        SqlDataAdapter sqlda = new SqlDataAdapter("Select BId,BBRoom,ResRatePackageID from tblResRatePackages where BID [email protected]", Con); 
        SqlParameter resI = new SqlParameter("@RId", resId); 
        sqlda.SelectCommand.Parameters.Add(resI); 
        DataSet dt = new DataSet(); 
        sqlda.Fill(dt, "tblResRatePackages"); 
        if (dt.Tables[0].Rows.Count > 0) 
        { 
         RatePackageId = Convert.ToInt64(dt.Tables[0].Rows[0]["ResRatePackageID"]); 

         Int64 HID = ResId; 
         Int64 HRID = RatePackageId; 

         SendInvUpdate.InvServices.UpdateRatePackagesRequest request = new SendInvUpdate.InvServices.UpdateRatePackagesRequest(); 


         request.HotelId = account.HotelId; 

         int avail = inrec.InvCount; 
         DateTime frodte = inrec.InvDate; 

         int NoofRatePackages = 3; 
         UpdateRatePackageRequest[] RatePackages = new UpdateRatePackageRequest[NoofRatePackages]; 
         string res; 
         request.RatePackages = new UpdateRatePackageRequest[NoofRatePackages]; 
         request.RatePackages = RatePackages; 

         for (int i = 0; i < NoofRatePackages; i++) 
         { 
          UpdateRatePackageRequest rp = new UpdateRatePackageRequest(); 

          request.RatePackages[i] = rp; 

          rp.RatePackageId = HRID; 

          rp.Rates = new RateDetails[NoofRatePackages]; 

          for (int j = 0; j < NoofRatePackages; j++) 
          { 

           RateDetails rd = new RateDetails(); 
           rp.Rates[j] = rd; 

           rd.Availability = avail; 

           rd.AvailabilityApplicationType = SendInvUpdate.InvServices.AvailabilityApplicationType.SET; 

           rd.FromDate = frodte; 

          //  rd.ToDate = todte; 

          } 

         } 

         SendInvUpdate.InvServices.InventoryServiceClient isc = new SendInvUpdate.InvServices.InventoryServiceClient(); 
         or = isc.UpdateRatePackages(request); 


         res = or.Results.ToString(); 


        } 

       } 
      }        

     } 

     catch (Exception ex) 
     { 
      throw (ex); 
     } 
    } 

} 

}あなたは例外をキャッチし、あなたがやっているように、再びそれをスローすることによってあなたの本当の例外スタックトレースを隠している

答えて

1

tryしようとしていること:try-catchブロックの開始点、つまりconnStr =行にブレークポイントを設定し、コードを1行ずつ進んでメソッド呼び出しを進めます。このようにして、コードのどの部分がエラーをスローしているかを素早く追跡し、その時点で特定の問題を探すことができます。 (あなたは元の例外と再通知のメッセージを再読み込みの前に読むこともできます。)

あなたの質問のタイトルが与えられているので、あなたが持っているエラーがキャスティングの例外であると仮定すると、チェックはあなたのデータベースのデータ検索コードにあります。たとえば、sdr.GetInt32(0)を使用している場合、列0を整数に変換できなかった場合、このようなエラーが発生します。

これが役に立ちます。より多くの情報を追跡することができれば、それを投稿すれば、より具体的なアドバイスができるかどうかがわかります。

+0

:それは可能.NETは番号を解釈するために作らラインadapter.ReturnProviderSpecificTypes = true;の添加は、N番目の小数(最後の桁が何らかの理由で3から4に切り上げ...)に丸め私のために私のエラーを指摘した。私はスロー例外を取り除いただけで、ターゲットサイトで次のようにしました:{Int32 get_Int32()}ブレークポイントでまだデバッグしていません – user1270384

3

try { 
    ... 
} 
catch(Exception ex) // catch all exceptions 
{ 
    throw ex;  // throw the same exception, removing the old stack trace 
} 

try/catch全体を削除するか、またはに変更する必要があります。

try { 
    ... 
} 
catch(Exception ex) // catch all exceptions 
{ 
    throw;   // throw the last caught exception, keeping the stack trace 
} 

突然、元の例外の正確な場所を確認することができます。すぐにあなたのエラーを見つけることができると確信しています。

1

私の場合、このエラーメッセージが表示されると、Oracleは不合理な番号を返すことが判明しました。

adapter.Fill(ds);で「指定されたキャストが有効ではありません」という例外がスローされました。使用していたコードで.NETが戻り値を正しく解釈していませんでした。私はちょうどあなたを考える2.25000000000000333333333333333333333334

private static DataSet dataset_test(string sql) 
    { 
     DataSet ds = new DataSet(); 
     using (OracleConnection objConn = new OracleConnection(connectionstring)) 
     { 
      OracleCommand objCmd = new OracleCommand(); 
      objCmd.Connection = objConn; 
      objCmd.CommandText = sql; 
      objCmd.CommandType = CommandType.Text; 
      try 
      { 
       objConn.Open(); 
       OracleDataAdapter adapter = new OracleDataAdapter(objCmd); 
       adapter.ReturnProviderSpecificTypes = true; 
       adapter.Fill(ds); 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
      objConn.Close(); 
      return ds; 
     } 
    } 
関連する問題