台灣最大程式設計社群網站
線上人數
810
 
會員總數:243865
討論主題:188351
歡迎您免費加入會員
討論區列表 >> ASP.NET >> Table 內有值,但出現"並未將物件參考設定為物件的執行個體"error
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Table 內有值,但出現"並未將物件參考設定為物件的執行個體"error
價值 : 50 QP  點閱數:188 回應數:6

樓主

芝麻泡芙
門外漢
0 1
22 2
發送站內信

Search 部分確定有資料顯示在網頁上,但是在Export 部分,if (dt.Rows.Count == 0)這行顯示"並未將物件參考設定為物件的執行個體"的錯誤訊息
請各位大大幫我看一下哪裡有問題,謝謝! 程式碼如下:

DataSet DS = new DataSet();
Literal Lter = new Literal();
protected void Page_Load(object sender, EventArgs e)
{
}
protected void BT_SearchData_Click(object sender, EventArgs e)
{
string query = @"
SELECT * FROM Detail
WHERE (Date like '%'+ @Keyword +'%') OR
(Name like '%'+ @Keyword +'%')
Order by Date ";
using (SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["ProblemReport_TableLink"].ConnectionString))
{
SqlDataAdapter da = new SqlDataAdapter(query, conn);
da.SelectCommand.Parameters.AddWithValue("@Keyword", this.TB_Search.Value.ToString());
da.Fill(DS, "DetailA");



if (DS.Tables["DetailA"].Rows.Count == 0)
{
Response.Write("<Script language='JavaScript'>alert('搜尋後無資料,請重新搜尋!\\n');</Script>");
this.BT_Export.Visible = false;
}
else if (DS.Tables["DetailA"].Rows.Count > 0)
{
Lter.Text = "<table >";
Lter.Text += "<tbody>";
for (int i = 0; i <= DS.Tables["DetailA"].Rows.Count - 1; i++)
{
Lter.Text += "<tr>";
for (int j = 0; j <= DS.Tables["DetailA"].Columns.Count - 1; j++)
{
Lter.Text += "<td>" + DS.Tables["DetailA"].Rows[i][j].ToString() + "</td>";
}
Lter.Text += "</tr>";
}

Lter.Text += "</tbody></table>";

this.ShowTable.Controls.Add(Lter);
}
}
}

protected void BT_Export_Click(object sender, EventArgs e)
{
DataTable dt, dt2 = new DataTable();
dt = DS.Tables["DetailA"];
dt2 = DS.Tables["DetailB"];
if (dt.Rows.Count == 0)
{
Response.Write("<Script language='JavaScript'>alert('0!\\n');</Script>");
}
else { Response.Write("<Script language='JavaScript'>alert('Have Data!\\n');</Script>"); }
}

搜尋相關Tags的文章: [ 並未將物件參考設定為物件的執行個體 ] , [ DataTable ] , [ asp.net ] , [ C# ] ,
本篇文章發表於2018-11-27 18:04
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

MIS2000 Lab
檢舉此回應
我沒有親自執行,只看了您的程式碼。

我猜:BT_Export_Click事件底下的 dt
的確是空的啊

有哪一列程式把 "數據" 餵給它嗎?

本篇文章回覆於2018-11-27 20:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

芝麻泡芙
檢舉此回應
我在BT_SearchData_Click 用SqlDataAdapter把資料塞到DetailA 裡面 --> da.Fill(DS,"DetailA");,
DataSet DS = new DataSet(); 放在BT_SearchData_Click 和 BT_Export_Click 外面。
並且有執行SearchData之後才可以執行Export的部分.

在BT_SearchData_Click 裡 if (DS.Tables["DetailA"].Rows.Count == 0)可以進行判斷,用this.ShowTable.Controls.Add(Lter); 在網頁上確實有顯示資料出來。
但是在 BT_Export_Click 裡 if (DS.Tables["DetailA"].Rows.Count == 0)在這一行出現"並未將物件參考設定為物件的執行個體"錯誤


本篇文章回覆於2018-11-28 09:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

MIS2000 Lab
檢舉此回應
各自的兩個事件
只因為你的變數名稱(dt)相同,就能共用資訊嗎?

再想想 :-)

另外,網頁程式 Http是一種「沒有狀態(stateless)」的協定
您的寫法,或許在 Windows Form上OK
但網頁上就不行
本篇文章回覆於2018-11-28 09:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
最有價值解答

topcat
捐贈 VP 給 topcat 檢舉此回應
這是蠻標準的頁面生命週期迷思

A.我以為程式只要執行過,把資料放到公用變數,下次執行裡面就會有資料
B.ASP.NET每一次PostBack後,都會重新執行一次程式
C.Web的應用系統,預設是沒有狀態的(沒有保留上一次執行的結果,每次都是新的)
要保留狀態,應該用適當的機制進行保留,例如:Session, ViewState, Cookie, ...

說明為什麼
從您的程式來看,應該會這樣執行
1.初次載入頁面 會觸發『Page_Load』
2.按下『BT_SearchData』按鈕,取得資料。會觸發『Page_Load, BT_SearchData_Click()』
3.按下『BT_Export』按鈕,要對資料處理。會觸發『Page_Load, BT_Export_Click()』

2.的確會取得資料
3.的時候∼
還記得嗎?沒有狀態保留∼
所以重新執行時,沒有經過『BT_SearchData_Click()』,取得資料
因此去觸發『BT_Export_Click()』當然就『連物件都沒有』
自然就是『並未將物件參考設定為物件的執行個體"』這個錯誤

---
解決方式
小喵建議
把讀取資料抽出,放在一個function中 ,假設叫做getData()

BT_SearchData_Click()
去執行getData()

BT_Export_Click()
先執行一次getData()
再執行原本裡面的東西

醬子就可以了
^_^

本篇文章回覆於2018-11-28 09:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
題外話,但很重要

請『不要』用Response.Write去動態注入JavaScript
如果您去瀏覽器檢視原始碼,看看您這樣做,他的程式碼生成在哪
您就知道,其實這樣的html內容其實是不太對∼

怎麼做才對
建議您仔細看這一篇
https://dotblogs.com.tw/hatelove/archive/2009/10/28/11325.aspx

^_^
本篇文章回覆於2018-11-28 09:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

芝麻泡芙
檢舉此回應
問題解決了! 使用 topcat 提供的解決方法。
感謝 MIS2000 Lab 與 topcat 提供想法與引導,並指出其他應修改的地方。
謝謝! ^-^
本篇文章回覆於2018-11-28 11:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.