2010-08-19 65 views
2

我使用Sybase.AdoNet2.AseClient從控制檯C#應用程序中訪問Sybase ASE數據。並不總是,但不時,我得到System.NullReferenceException下面的代碼。AseDataReader引發的System.NullReferenceException

它只適用於一個啓動的應用程序,但如果我在我的計算機中同時啓動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()); 
    } 
} 

它發生在「同時(reader.Read())」,並已以下調用堆棧的線。

System.NullReferenceException:未將對象引用設置爲對象的實例。 在Sybase.Data.AseClient1.AseDataReader.Read()
在Sybase.Data.AseClient.AseDataReader.Read()
在虛擬()

會很感激,如果有人能幫助我。

+0

它發生在 「while(reader.Read())」行,並具有以下調用堆棧。 System.NullReferenceException:未將對象引用設置爲對象的實例。 ()上的Sybase.Data.AseClient.AseDataReader.Read() 上的Sybase.Data.AseClient1.AseDataReader.Read() 上的( ) – Sam 2010-08-19 05:54:28

回答

0

我想那spCommand.ExecuteReader()而不是返回空讀者返回null對象。在這種情況下,我建議chceck如果它是閱讀前空:嗯,這當然

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

因爲spCommand.ExecuteReader返回空。但不幸的是我無法找到爲什麼SysBook Online參考引發了空異常。也許有不同的命令的行爲

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的答案就足夠了嘗試;)

0

非常感謝了答案。

readerspCommand.ExecuteReader()返回的不是null。您可以從調用堆棧中看到異常發生在Sybase.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可以用_disposed作爲true被拋出。但不是很確定,如果這是我的情況引發的例外。

0

這是一個位在黑暗中拍攝的,但我會嘗試使用作用域的對象:

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

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

我們一直需要範圍我們SYBASE物體,特別是連接對象,由於怪行爲。無論如何,我不認爲sybase庫是可管理的,所以它確實是最好的實踐,可以在任何可能的情況下進行明確的清理。

相關問題