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 BId=@ResId",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 =@ResortId", 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);
        }
    }

}

}

4

3 に答える 3

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
}

元の例外の正確な場所を突然確認できるようになります。エラーはすぐに見つかると思います。

于 2012-04-18T04:59:46.430 に答える
2

私の場合、このエラー メッセージが表示されると、Oracle は無理数を返していることが判明しました。

adapter.Fill(ds);私のコードは、 .NET で「指定されたキャストが無効です」という例外をスローしていましたが、使用していたコードで返された数値を正しく解釈していませんでした。行の追加により、adapter.ReturnProviderSpecificTypes = true;.NET が N 番目の 10 進数に丸められた数値を解釈できるようになりました (最後の桁は何らかの理由で 3 から 4 に切り上げられました...): 2.2500000000000033333333333333333333334

    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;
        }
    }
于 2014-06-04T12:18:38.330 に答える
1

試してみる1つのこと:try-catchブロックの先頭、connStr =行にブレークポイントを設定し、コードを1行ずつステップ実行して、メソッド呼び出しを進めます。このようにして、コードのどの部分がエラーをスローしているのかをすばやく追跡し、そのポイントに戻って特定の問題を探すことができます。(再スローする前に、元の例外メッセージと内部例外メッセージを読み取ることもできます。)

あなたの質問のタイトルを考えると、あなたが持っているエラーがキャストの例外であるという仮定で、私が最初にチェックする場所はあなたのデータベースデータ検索コードでしょう。たとえば、sdr.GetInt32(0)を使用している場合、列0を整数に変換できなかった場合、この種のエラーがスローされます。

お役に立てれば。より多くの情報を追跡できる場合は、それを投稿してください。より具体的なアドバイスを提供できるかどうかを確認します。

于 2012-04-18T06:01:16.310 に答える