none
有關RUN TIME ERROR 及 Object reference not set to an instance of an object 的問題 RRS feed

  • 問題

  • 各位好,

    小的在編寫程式時,遇上奇怪的問題,麻請各位賜教一下。

    小的在編寫一個asp.net的web app,一當中的一個新增record的function內, 當要一次性新增超過 8 條record時,即有機會出現Object reference not set to an instance of an object 的問題. 同時,只要這個問題出現,全個web app都會出現run time error而法運作.

    從debug過程中發現,程式在執行到某個次數之後就突然死亡,但由於 insert statment是由for loop 生成,而輸入資料又沒有錯誤,所小的排除了是statment或code的問題.轉移向sql server 及 connection 方向研究.(懷疑是因app query時超時)

    但無論小的如何設定 app內各個sql.comanmd的command.timeout(現已set為0) 或session.timeout(已web.config中,另設一個為300的value)都無法解決。

    請問各位可有甚麼眉目或意見可以指點﹖謝謝。

    2010年3月22日 上午 08:23

解答

  • 終於解決了。

     

    原來是其中一個公用生成dataset的function,在return後沒有沒有把connection及dataset完整地close及dispose,導致過多connection而死亡……

    感謝各位的幫忙,謝謝。

    2010年3月25日 上午 06:47

所有回覆

  • 沒有程式碼無從判斷。
    8 條 record 基本上不可能發生這樣的問題,除非你自己的物件生命週期沒有控好。

    INSERT 指令超時的可能原因大概除了 I/O 就是交易了,你也可以查查交易的流程有沒有問題。


    以下為簽名檔,請勿對話入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年3月22日 上午 08:55
    版主
  • 沒有程式碼無從判斷。
    8 條 record 基本上不可能發生這樣的問題,除非你自己的物件生命週期沒有控好。

    INSERT 指令超時的可能原因大概除了 I/O 就是交易了,你也可以查查交易的流程有沒有問題。


    以下為簽名檔,請勿對話入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白


    不好意思,現在補回當中的程式碼︰

     

    'lblHiddentTotalNumbers.Text 就是由user於前一頁指明要新增的records數目

    For

    i = 0 To CInt(lblHiddentTotalNumbers.Text) - 1

     

    '頁面用來get user input的control都是dynamic create出來的;小的已用lable track到是可以如expect中get到相關value

    intSize =

    CInt(CType(FindControl("txtSize" & i), TextBox).Text)

    intRecordLength = Gobal.GetRecordTypeLength(lblHiddentRecordTypeID.Text)

    intPropertyID = Gobal.GetRecordTypePropertyID(

    CType(FindControl("drpPropt" & i), DropDownList).Text)

    intTypeID = Gobal.GetRecordTypeMandatoryID(

    CType(FindControl("drpType" & i), DropDownList).Text)

    strFieldName =

    CType(FindControl("txtFieldName" & i), TextBox).Text

    strConstValue =

    CType(FindControl("txtConstValue" & i), TextBox).Text

    intPaddValueID = Gobal.GetRecordTypePaddingID(

    CType(FindControl("drpPaddValue" & i), DropDownList).Text)

     '<<BREAK POINT A>>

    '然後是一堆堆validation的工序,當中牽涉mssql 的query

    intRecordIndicator = Gobal.GetRecordTypeDetailIndicatorValue(lblHiddentFileLayoutID.Text)

     

    If intRecordIndicator = -1 Then

     

    'lblMsg.Text = ErrMsg.getErrorDescription("Error-006", "Record Indicator")

    strErrorMsg = strErrorMsg &

    "Field Order " & i + 1 & ": " & ErrMsg.getErrorDescription("Error-006", "Record Indicator") & "<br/> "

     

    'CType(FindControl("chkRecordIndicator" & i), CheckBox).Focus()

     

    'Exit Sub

     

    End If

     

     

    If CType(FindControl("chkRecordIndicator" & i), CheckBox).Checked = True Then

     

    If CType(FindControl("drpType" & i), DropDownList).Text <> "M" Then

    strErrorMsg = strErrorMsg &

    "Field Order " & i + 1 & ": " & ErrMsg.getErrorDescription("Error-010", "Type", "Mandatory") & "<br/> "

     

    Else

    intRecordIndicator = 1

     

    End If

     

    Else

    intRecordIndicator = 0

     

    End If

    strRemark =

    CType(FindControl("txtRemark" & i), TextBox).Text

    intSeq = Gobal.GetRecordTypeDetailSeqNo(lblHiddentRecordTypeID.Text)

     

    '最後就是insert的動作

    strSql =

    "INSERT INTO tblRecordTypeDetail "

    strSql = strSql &

    "(Record_Type_ID,Seq,Field_Size,Field_Properties_ID,Mandatory_Type_ID,Field_Name,Constant_Value,Padding_ID,Record_Indicator,Remarks,Creation_Date,Created_By) "

    strSql = strSql &

    "VALUES ("

    strSql = strSql &

    "'" & lblHiddentRecordTypeID.Text & "', "

    strSql = strSql &

    "'" & intSeq & "', "

    strSql = strSql &

    "'" & intSize & "', "

    strSql = strSql &

    "'" & intPropertyID & "', "

    strSql = strSql &

    "'" & intTypeID & "', "

    strSql = strSql &

    "'" & Replace(strFieldName, "'", "''") & "', "

    strSql = strSql &

    "'" & Replace(strConstValue, "'", "''") & "', "

    strSql = strSql &

    "'" & Replace(intPaddValueID, "'", "''") & "', "

    strSql = strSql &

    "'" & intRecordIndicator & "', "

    strSql = strSql &

    "'" & Replace(strRemark, "'", "''") & "', "

    strSql = strSql &

    "getdate(), "

    strSql = strSql &

    "'" & sLoginID & "'"

    strSql = strSql &

    ")"

     

     

    strErrorMsg = strErrorMsg & "<br/>" & strSql

     

    Next

     

    ''--------------

    主要問題是出於如果新增多於8隻RECORD時,APP就會於 <<BREAK POINT A>> 終結,

    小的已設數個BREAK POINT來TRACE,看著RETURN的 DATA都是正確的,唯獨到了第9次,於<<BREAK POINT A>>後,開始VALIDATION當中就

     

    RETURN "Object reference not set to an instance of an object". 

    因此,小的正在不斷地修整CONNECTION/SESSION的TIMEOUT參數;的確,可供執行的record時多了,到達15隻,但發現了問題是更隨機性出現,成功return出15隻record後,再轉頁時就run time error了……所以雖然是指向了connection的問題,但不知小的想法是否正確……所以想向各位請教,謝謝

    2010年3月22日 上午 10:20
  • 確認一個問題, 你是每Insert一筆就會Redirect 頁面一次 ?
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年3月22日 上午 10:51
  • 1. 你程式碼太亂,我看不是很懂,但依你的描述,錯誤是在這行:

    intRecordIndicator = Gobal.GetRecordTypeDetailIndicatorValue(lblHiddentFileLayoutID.Text)

    你的 lblHiddentFileLayoutID 在當時應該是 NULL,這是動態生成的還是已設定在網頁中的?

    2. 你的 SQL 有 SQL Injection 的問題,最好改成參數化查詢。

     


    以下為簽名檔,請勿對號入座:
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年3月22日 上午 10:57
    版主
  • 先感謝兩位的解答。

    re Bill Chung:

    不會一筆筆redirect的,只有當所有的insert完成,for loop完成後才會redirect出去(除了有error)

     

    re 小朱:

    先說句對不起,post的有黠混亂……很抱歉……

    lblHiddentFileLayoutID是頁面的control,不是動態生成的,經由上頁傳過去。最開始我也懷疑那個值在中間不知為何沒了,但我也已經trace過了,lblHiddentFileLayoutID.text內一直保有著相對的值,沒變呢……所以才想不通……

    而且最不解的是,曾試過完成新增,但click到另一頁就馬上run time error了……因此不知是甚麼東東把我的session或connection 佔用著,還是我的connection與session早一步歸天了……

    另外,謝謝閣下的建議,小的會把那sql整頓一下。

    2010年3月22日 上午 11:15
  • GetRecordTypeDetailIndicatorValue的程式碼呢?

    有進去設中斷點嗎?

    2010年3月22日 下午 02:43
    版主
  • 終於解決了。

     

    原來是其中一個公用生成dataset的function,在return後沒有沒有把connection及dataset完整地close及dispose,導致過多connection而死亡……

    感謝各位的幫忙,謝謝。

    2010年3月25日 上午 06:47