追蹤
lionab資管物語
關於部落格
這是一個資訊管理, ERP, 3C, 旅遊, 勸敗的分享園地
  • 152783

    累積人氣

  • 53

    今日人氣

    0

    追蹤人氣

預存程序裡使用暫存資料表在DataSet抓不到的問題

試了幾天後, 發現不只一個問題, 依序說明解法如下:
1. ASP.NET所呼叫的預存程序裡, 不能使用 #字開頭的暫存資料表 Table名稱:
#字開頭的Table名稱是SQL Server暫存資料表的標準命名方式, #開頭的暫存資料表會被建立在 tempdb 資料庫裡, 由SQL Server 維護其生命周期, 也就是SQL Server 會定期刪除tempdb裡的暫存資料表.
如果只是在 預存程序裡使用 #字開頭的暫存資料表, 完全是沒有問題的, 但是ASP.NET在叫用預存程序時 ,發現裡面使用了#字開頭的暫存資料表時, 會驗證此Table是否存在, 因為tempdb裡的Temp Table會被改名, 造成ASP.NET找不到相同的Table名稱, 因此會出現"無效的物件名稱#tmp01"錯誤訊息.
把#字拿掉, 改用實際的Table名稱後 ,預存程序必須自己維護該Table的生命周期, 通常是預存程序一開始, 先檢查資料庫裡有無相同名稱的Table, 如果發現此Table存在, 則直接刪除.
參考語法如下:
IF EXISTS(SELECT name FROM sys.tables WHERE name = 'tmpRpt01')
          BEGIN
                   drop table tmpRpt01
          END

2. 暫存資料表必須存在, ASP.NET才會驗證通過
        在預存程序的最後, 原本是要再下達一次上述檢查及刪除Table的語法程序, 但為了在 ASP.NET裡能夠被驗證通過, 因此預存程序的最後, 不需要有刪除Table的語法.
因此我先手動執行一次預存程序, 讓SQL先產生一個暫存資料表在資料庫裡.

因此, 再作一次在DataSet 裡新增 TableAdapter物件, 設定Select 程序時指定了預存程序後, 右邊的資料行視窗就能正常顯示各個欄位名稱了.

相簿設定
標籤設定
相簿狀態