2009-05-29 142 views
18

當我將特定存儲過程拖入VS 2008 dbml設計器時,它顯示返回類型設置爲「無」,並且它是隻讀的,所以我可以不會改變它。設計器代碼將其顯示爲返回一個int,如果我手動更改它,它只會在下一個版本中取消。LINQ to SQL - 無法修改存儲過程的返回類型

但與另一個(幾乎完全相同)的存儲過程,我可以返回類型就好了改變(從「自動生成的類型」到我想要的東西。)

我在兩個不同的機器上運行了這個問題。任何想法發生了什麼?

這裏是存儲過程的工作原理:

USE [studio] 
GO 
/****** Object: StoredProcedure [dbo].[GetCourseAnnouncements] Script Date: 05/29/2009 09:44:51 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 
CREATE PROCEDURE [dbo].[GetCourseAnnouncements] 
    @course int 
AS 
SELECT * FROM Announcements WHERE Announcements.course = @course 
RETURN 

而這一次沒有:

USE [studio] 
GO 
/****** Object: StoredProcedure [dbo].[GetCourseAssignments] Script Date: 05/29/2009 09:45:32 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 
CREATE PROCEDURE [dbo].[GetCourseAssignments] 
    @course int 
AS 
SELECT * FROM Assignments WHERE Assignments.course = @course ORDER BY date_due ASC 
RETURN 
+0

我遇到問題嘗試添加查詢未在該數據庫中存在的表中的SP時就來了。 – 2011-11-08 19:53:54

回答

5

好吧,我發現這個問題......那種。我改變了表格「Assignments」的名稱,忘記更新存儲過程,因此DBML設計者感到困惑。但即使在我更新存儲過程之後,從DBML設計器中刪除它並讀取它,它不起作用!

這幾乎與此處討論的問題相同:http://forums.asp.net/t/1231821.aspx

它只有當我從數據庫中刪除存儲過程並重新創建它,並從DBML設計器中刪除它,重新編譯,重新啓動Visual Studio並再次添加它時才起作用。這是我第二次遇到Visual Studio DBML設計器的「刷新」問題......

18

我也多次看到這個問題,雖然我不知道是什麼原因造成的,但我已經遇到一個非常簡單的方法來通過它。它涉及手動編輯.dbml文件中的xml,但它是一個非常簡單的編輯。

右鍵單擊解決方案資源管理器中的Data Context的.dbml文件(不是.layout文件或designer.cs文件),然後使用XML編輯器打開它。您應該在<Function> ... </Function>區塊中找到您的存儲過程。您還應該找到您想設置爲<Type> ... </Type>區塊中列出的返回類型的自定義類。

第一步是給你的自定義類標識符。

<Type Name="MyCustomClass" Id="ID1"> 

第二步是要告訴你的功能,使用新ID'd類型的返回類型:您可以通過添加一個「身份證」標籤,這樣,確保它的DBML文件中是唯一這樣做的。你在你的<Function>塊,看起來像

<Return Type="System.Int32" /> 

<ElementType IdRef="ID1" /> 

保存文件,退出,並重新通過更換行這樣做。完成。在設計模式下重新打開.dbml文件以驗證:您的過程現在將自定義類設置爲返回類型。

+1

我發現我還需要編輯.designer.cs文件以更新存儲過程方法的返回類型。否則,在代碼中使用時,存儲過程方法仍然會返回一個int值。 – Tarsier 2010-09-03 13:08:00

1

我有同樣的問題,但只有發生,如果我的SP使用FTS,也恰好我所做的是「欺騙」 dbml設計器,我刪除fts語言的東西,並完美的作品,現在我可以改變返回類型。後來我去sp,並再次添加fts並且完美地工作! 希望得到這個幫助。

12

我有一個類似的映射問題,但是我發現在我的案件的罪魁禍首。

如果你的程序或任何子過程被調用有一個像

CREATE TABLE #result (
    ID INT, 
    Message VARCHAR(50) 
) 

臨時對象,那麼你就麻煩了,即使你不選擇這些臨時對象的任何東西。

映射程序對這些臨時對象有一個普遍的問題,因爲該類型可以在會話上下文的過程之外進行更改。臨時對象對於映射器來說不是安全的,他拒絕使用它們。

由表變量替換他們,你回到業務

DECLARE @result AS TABLE (
    ID INT, 
    Message VARCHAR(50) 
) 
+1

有人想知道這是否被記錄在任何地方,我一直在尋找一整天之前,我發現這一點 – CheGueVerra 2013-07-30 15:45:10

1

來解決這個問題的方法是:

  1. 添加「設置FMTONLY關;」到您的存儲過程的開始。
  2. 添加該語句後,獲取DBML爲您的存儲過程生成代碼。

如果您的存儲過程的返回類型仍然是在DBML代碼「詮釋」,評論存儲過程的完整代碼,創建一個新的SELECT語句,它返回的字段類型和名稱與原來的SELECT語句,並獲得DBML再生代碼再次。它必須工作!

9

我跟着link provided by Tony一個更好的解決方案(相同的答案阿拉什的)

  • 務必閱讀博客,尤其是最後一部分,有考慮加入SET當FMTONLY OFF一件事你存儲過程。

當您在存儲過程的開頭添加

SET FMTONLY OFF 

並加載到DBML,
LINQ2SQL將執行實際的存儲過程。

要獲得正確的返回表對象類型,
表示存儲過程在調用w/o參數時必須返回某些內容。
表示:
1。有默認值的所有輸入參數
2.確保SP返回的數據至少由一排 - 這是我無意中發現

create table #test (text varchar(50)); 
insert into #test (text) values ('X'); -- w/o this line, return type would be Int32 
select * from #test; -- SP returns something, proper object type would be generated 
return; 
5

我設法制定出一個更簡單的方法,剛剛不明顯

  1. 從.dbml文件的設計表面刪除存儲過程
  2. 點擊保存所有文件
  3. 單擊刷新在服務器資源管理器上:在當時,當寫下來,但直接的聲存儲過程的列表
  4. 添加(拖)存儲過程放回.dbml文件的設計表面
  5. 單擊Save All
  6. 單擊構建
  7. 檢查designer.cs代碼文件,你將有存儲過程的新版本更新的C#代碼

檢查http://www.high-flying.co.uk/C-Sharp/linq-to-sql-can-t-update-dbml-file.html

1

感謝@Rubenz,我也是在一個存儲過程,你使用FTS(全文搜索)步驟工作。

我評論了存儲過程中的FTS部分,將存儲過程添加到.dbml,然後取消註釋FTS部分回到原始。

0

好的,我不想在我的Designer.cs代碼中改變任何東西,我知道有一個不同的問題,它不與我的存儲過程(我沒有使用臨時表)。

簡單地從數據庫中刪除sp並更新模型根本沒有幫助。創建的新模型仍然存在相同的問題...

我發現,由於某種原因,我的sp的副本是在DatabaseModel - > Function Imports中創建的。

我做了什麼,我刪除了函數導入中的重複對象並更新了模型。有效!

的問候, 克里斯

相關問題