2

コンソール C# アプリケーションから Sybase ASE データにアクセスするために Sybase.AdoNet2.AseClient を使用しています。常にではありませんが、時々、次のコードで System.NullReferenceException が発生します。

アプリケーションが 1 つだけ起動されていれば問題なく動作しますが、自分のマシンで同時に 10 個のプロセスを起動すると、この例外で失敗します。

public void Dummy()
{
    List<string> valueList = new List<string>();

    AseParameter[] arParms = new AseParameter[1];
    arParms[0] = new AseParameter("@date", AseDbType.Date);
    arParms[0].Value = Convert.ToDateTime("1/08/2010");

    AseCommand spCommand = new AseCommand();
    spCommand.CommandType = CommandType.StoredProcedure;
    spCommand.Connection = connection;
    spCommand.CommandText = "MyStoredProcedure";

    spCommand.Parameters.AddRange(arParms);

    AseDataReader reader = spCommand.ExecuteReader();
    while (reader.Read())
    {
        if (reader["MyColumn"] != DBNull.Value)
            valueList.Add(reader["MyColumn"].ToString());
    }
}

「while (reader.Read())」の行で発生し、以下のコールスタックがあります。

System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。Sybase.Data.AseClient1.AseDataReader.Read()
で Sybase.Data.AseClient.AseDataReader.Read()
で Dummy()

誰かが私を助けてくれれば、とても感謝しています。

4

5 に答える 5

0

答えてくれてありがとう。

しかしreader、から返されるのspCommand.ExecuteReader()はではありませんnullSybase.Data.AseClient1.AseDataReader.Read()コールスタックからわかるように、例外は内部で発生します。

以下は私がリフレクターから得たコードです。

public bool Read()
{
  this.OnTraceEnterEvent("Read", null);
  if (this._disposed)
  {
    throw new NullReferenceException();
  }
  if (this.IsClosed)
  {
    throw new AseException(DriverMsgNumber.ERR_RESULTSET_DEAD, null);
  }
  bool state = false;
  if (!this._bNoResultSet)
  {
    state = this.Peform_Next();
    state = this.CheckSingleRow(state);
  }
  this.OnTraceExitEvent("Read", state);
  return state;
}

としてNullReferenceException投げられる可能性があることがわかります。しかし、それが私の状況でスローされる例外であるかどうかはよくわかりません。_disposedtrue

于 2010-08-19T07:09:57.897 に答える
0

spCommand.ExecuteReader()空のリーダーを返す代わりに、オブジェクトを返すと思いnullます。この場合、読む前にnullの場合はchceckすることをお勧めします。

AseDataReader reader = spCommand.ExecuteReader();
if(reader != null)
   while (reader.Read())
   {
        if (reader["MyColumn"] != DBNull.Value)
            valueList.Add(reader["MyColumn"].ToString());
   }
于 2010-08-19T05:59:36.297 に答える
0

もちろん、これは spCommand.ExecuteReader が null を返すためです。残念ながら、SysBook Online のリファレンスで Null Exception がスローされる理由がわかりませんでした。おそらく、別のコマンド動作で試してください

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sdk_12.5.1.adonet/html/adonet/Asacommand_apiref.htm

http://msdn.microsoft.com/en-us/library/system.data.commandbehavior.aspx

何かのようなもの

reader.ExecuteReader(CommandBehavior.CloseConnection)

または、ŁukaszW.pl の回答で十分だと思います ;)

于 2010-08-19T06:19:54.707 に答える
0

これは暗闇でのショットですが、以下を使用してオブジェクトのスコープを設定してみます。

using (AseCommand spCommand = new AseCommand())
{
     //etc..

     using (AseDataReader reader = spCommand.ExecuteReader())
     {
         // until end of while loop
     }
}

異常な動作のため、sybase オブジェクト、特に接続オブジェクトのスコープを常に設定する必要がありました。いずれにせよ、sybase ライブラリが管理されているとは思わないので、可能な限り明示的にクリーンアップすることがベスト プラクティスです。

于 2010-08-22T14:04:41.133 に答える
0

これは古い質問ですが、この問題に出くわしてその理由を見つけたので、次のとおりです。リーダーはnullではありませんでしたが、データを読み取る前に接続が閉じられたため、「IsClosed = true」でした。

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sdk_12.5.1.adonet/html/adonet/Isclosed_asadatareader_apiref.htmによると、リーダーが閉じられると、呼び出すことしかできません。 IsClosed および RecordsAffected。

于 2012-06-05T09:41:09.260 に答える