2011-12-20 5 views
1

このコードは、Windows Server 2008 R2およびSQL Server 2008 R2 ExpressのIIS.7でASP.NETを実行します。SQL Server 2008の.NET例外

これは、3つのパラメータに基づいてデータベースから選択し、選択した行を含むオブジェクトを返す単純な関数です。

このコードはほとんどの時間で正常に実行されますが、データベーステーブルの列名であるserial_numberという例外が発生することがあります。

これは完全な例外である:

[IndexOutOfRangeException:SERIAL_NUMBER]
System.Data.ProviderBase.FieldNameLookup.GetOrdinal(文字列フィールド名)2674398
System.Data.SqlClient.SqlDataReader.GetOrdinal(文字列名)249
System.Data.SqlClient.SqlDataReader.get_Item(文字列名)23
PhoneSerialNumber.GetByPhoneNumber(文字列にphoneNumber、文字の国、String型のアプリ)423
UpdateMeClass.GenereteVersこの例では、System.Web.CallHandlerExecutionStep.System.Web(System.Web.CallHandlerExecutionStep.System.Web)を使用して、System.Web.CallHandlerExecutionStep.System.Web(System.Web.CallHandlerExecutionStep.System.Web)のUpdateMe.ProcessRequest(HttpContextコンテキスト)をSystem.Web.CallHandlerExecutionStep.System.Web .HttpApplication.IExecutionStep.Execute() +599
System.Web.HttpApplication.ExecuteStep(IExecutionStepステップ、ブール& completedSynchronously)171

Iは、例外の場合の3つのパラメータを記録し、それらはあるが同じサーバー内の同じパラメーターを使用して同じ要求をシミュレートすると、正常に実行されることに注意してください。

例外の場合、クエリは正常に実行されますが、この例外を介して列の値を取得すると、間違っている可能性があります。

SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["meConnectionString"].ConnectionString); 

connection.Open(); 
SqlCommand cmd; 
using (connection) 
{ 
    cmd = new SqlCommand("select * from serialnumber_table join countries on country_id=countryid join applications on ApplicationID=App_ID where phone_number= @phoneNumber and [email protected] and [email protected]", connection); 
    cmd.Parameters.AddWithValue("@phoneNumber", phoneNumber); 
    cmd.Parameters.AddWithValue("@Country", Country); 
    cmd.Parameters.AddWithValue("@app", app); 

    using (SqlDataReader rdr = cmd.ExecuteReader()) 
    { 
     while (rdr.Read()) 
     { 
      sn = new PhoneSerialNumber(); 
      sn.SerialNumber = rdr["serial_number"].ToString(); 
      sn.PhoneNumber = rdr["phone_Number"].ToString(); 
      sn.PhoneLang = rdr["Lang"].ToString(); 
      sn.PhoneModel = rdr["ModelName"].ToString(); 
      sn.ApplicationVersion = rdr["App_Version"].ToString(); 
      sn.DealerCode = rdr["dealer_code"].ToString(); 
      sn.Size = rdr["size"].ToString(); 

      TimeSpan Time = DateTime.Parse(rdr["Renewal_Date"].ToString()) - new DateTime(1970, 1, 1, 0, 0, 0); 
      sn._renewal_Date = (long)(Time.TotalMilliseconds); 

      rdr.Dispose(); 
      connection.Dispose(); 
      return sn; 
     } 
    } 

    sn = new PhoneSerialNumber(); 
    sn.SerialNumber = null; 
    sn.PhoneNumber = null; 
    sn.PhoneModel = null; 
    sn.PhoneLang = null; 
    sn.ApplicationVersion = null; 
    sn.DealerCode = null; 
    connection.Dispose(); 
    return sn; 
} 
+1

ある? –

+2

なしあり例外は 'Serial_Number'と呼ばれていますので、実際にどのような例外が発生しますか? –

+0

DBに対してこのクエリを実行し、読み込んでいるデータがnullでないことを確認してください。rdr [" serial_number "] – ShelbyZ

答えて

3

頭に浮かぶ唯一のことは、あなたがあなたのクエリを実行し、いくつかの理由で、serial_number列が返されていないことです。 SELECT *を実行するのではなく、戻そうとしている個々の列ごとにselectを実行してみてください。

シリアル番号の列は他のどのテーブルにも複製されていますか?どのソースのビューですか? serial_numberがビューから来ていて、基礎となるテーブルを変更した場合は、ビューの適切な列を表示するために再構築する必要があります。

カラム名が現在のデータリーダーに存在しない場合、最初に選択されなかったか、単純に存在しなかったような例外がカラム名として表示された唯一の時間です

あなたが唯一の例外の原因として「シリアル値」を提供したことを考えると
+0

また、ソースがSQL機能(ビューだけでなく)は、関数を再構築する必要があります。 –

0

(それはおそらく例外自体にはできません)、私は犯人ラインはこの1つであると信じて:

sn.SerialNumber = rdr["serial_number"].ToString(); 

チャンスが実際にありますこの値はnullです。

実際に列が存在しないという問題がある場合は、この表が動的に生成されていて、誰かが自分の仕事を正しく実行していないかどうかを確認します。

+0

これは例外トレースです。私たちはashxページを使用しており、毎日この機能に30Kを超えるヒットがあることに注意してください。 http://www.mebackendserver.com/Me/errorslogs/Error_12_20_2011_12_35_17_AM.html –

+0

元の投稿の例外のスタックトレースを見つけてください –

+0

この場合、ソースデータセットに存在しない列を参照しようとしています。データセットは実行時に動的に生成されますか? –

0

奇数は、DBNull.Valueとして返されるnullを含んでいます。 rdr ["serial_number"]をrdr ["serial_number"]の代わりに文字列として使用してみてください。ToString()。

また、SELECT *を使用しないでください。必要以上のデータが返され、ネットワークトラフィックが増加し、SELECTの名前付き列がエラーメッセージを生成しやすくなります。

1

これは単なる推測ですが、rdrを2回処分している可能性もあります。 try/finallyブロックに変換するusingステートメントを使用して、PhoneSerialNumberを使用してreturnステートメントの前に明示的に変換します。既に処分しているものを処分すると例外がスローされます。例外が投稿されていないので、私はここで推測しています。

+0

rdr.Dispose(); osは2回処理されています。@AbdullahはMSDNやGoogleの検索方法を見て、なぜ()を使用するとあなたのコードを少しでもクリーンアップすることができます..また、設定ファイルからどうやって読んでいるのですか?その値を取得するか、またはプロパティアクセサーを作成するために静的変数をコードのどこかに上に置く – MethodMan

+0

これは例外トレースです。私たちはashxページを使用しており、毎日30Kを超えるヒットがこの関数に当てられます。 http://www.mebackendserver .com/Me/errorslogs/Error_12_20_2011_12_35_17_AM.html –

+0

rdr ["serial_number"]がnullであるかどうかを確認してください。また、あなたのコードで+ "\ n"を使用していることに気付きました。私が\ r \ n、またはEnvironment.NewLineを使用することをお勧めします。 – Cheesecake

0

のTimeSpan時間「の時間が例外で何KEY WORDの選択をしないではない場合..?また、あなたが選択クエリからすべてのフィールドを使用している、より意味のある変数名を使用*