2009-05-11 142 views
8

我正在維護一個具有SQL Server 2005後端的經典ASP網站。對於一小段新功能,我編寫了一個存儲過程來執行插入操作。這是數據庫中唯一的用戶存儲過程。「找不到存儲過程」

當我試圖調用從代碼存儲過程我得到以下錯誤:

 
Microsoft OLE DB Provider for SQL Server error '80040e14' 
Could not find stored procedure 'InsertGroup'. 
/newGroup.asp, line 84 

數據庫採用SQL Server身份驗證。當我在Visual Studio中使用與連接字符串中相同的user/pw連接到數據庫服務器時,存儲過程不可見,但所有表都是。

用戶具有datareader和datawriter角色以及存儲過程的顯式執行權限。

我缺少什麼?

更新:我的道歉,服務器管理員誤以爲它是一個2000服務器,當它實際上是一個2005服務器(運行在Windows Server 2003 x64)。

回答

40

恥辱之路:

連接字符串指向實時數據庫。錯誤消息是完全準確的 - 存儲過程僅存在於開發數據庫中。感謝所有提供出色答案的人,以及我浪費時間的道歉。

+3

您應該將此標記爲答案,以幫助其他可能不會讀到底的人。 你發佈這個很棒。我確信其他人已經完成並且會做類似的事情,像這樣的監督的例子可能會幫助其他人發現他的錯誤。 – GilM 2009-05-12 05:40:50

+6

@Chloraphil:看到開發人員傾向於認爲最可能的解釋不值得考慮,事先探索其他所有內容總是很有趣。 :) +1提供問題的原因。 – Tomalak 2009-05-12 08:47:10

+0

我必須等待48小時才能將此標記爲回答 – Chloraphil 2009-05-12 13:17:12

7

您可能需要檢查存儲過程的實際所有者是誰。如果它是一個特定的不同用戶,那麼這可能是你無法訪問它的原因。

+1

這發生在我身上好幾次,很煩人。如果可以,請在SQL Server Management Studio中打開數據庫,並在存儲過程之前查找'dbo'或'youruser'。如果它沒有'dbo',則刪除現有過程,並將其重新創建爲過程名稱的前綴。 – 2009-05-11 12:36:11

+0

或者,只需提到存儲過程屬於調用EXEC [dbo]的一部分的「所有者」(=「模式」)。[InsertGroup] – Tomalak 2009-05-11 12:46:26

+0

它是dbo.InsertGroup – Chloraphil 2009-05-11 13:37:39

2

確保您的模式名稱在連接字符串中?

+0

你能更具體嗎?我不熟悉如何做到這一點。無論如何,數據庫只使用「dbo」模式。 – Chloraphil 2009-05-11 14:50:37

+1

您可能有兩個數據庫,並且您認爲您指向一個數據庫,但實際上,您指向另一個數據庫。因此,StoredProc在一個數據庫上,但不是您正在運行的那個數據庫。這可能是一個配置錯誤。 – NealWalters 2012-01-09 20:28:05

1

有2個原因:

1存儲過程的名稱 當你在代碼中聲明存儲過程確保你不Exec的或執行關鍵字 例如:

C#

string sqlstr="sp_getAllcustomers";// right way to declare it. 

string sqlstr="execute sp_getAllCustomers";//wrong way and you will get that error message. 

從此密碼:

MSDBHelp.ExecuteNonQuery(sqlconexec, CommandType.StoredProcedure, sqlexec);

CommandType.StoreProcedure將僅查找存儲過程名稱,ExecuteNonQuery將執行存儲過程。

2-連接字符串:

另一個原因是錯誤的連接字符串。查看連接字符串內部,並確保您具有連接,尤其是數據庫名稱等。

3

有時候,當您使用參數調用存儲過程時也會發生這種情況。例如,如果你鍵入類似:

set @runProc = 'dbo.StoredProcedure' 
exec @runProc 

這將工作,但是:

set @runProc = 'dbo.StoredProcedure ''foods''' 
exec @runProc 

這將引發錯誤但這個「找不到存儲過程dbo.StoredProcedure‘食品’」,可以很容易地括號像這樣克服:

set @runProc = 'exec dbo.StoredProcedure ''foods''' 
exec (@runProc) 
0

找不到存儲過程----意味着,當你得到這個..我們的代碼一樣這

String sp="{call GetUnitReferenceMap}"; 

stmt=conn.prepareCall(sp); 

ResultSet rs = stmt.executeQuery(); 

while (rs.next()) { 

currencyMap.put(rs.getString(1).trim(), rs.getString(2).trim()); 

我有4個數據塊(SAMPLE1,SAMPLE2,樣本3),但stmt將搜索位置是master默認DB那麼我們將得到異常。

我們應該提供數據庫名稱,然後問題解決::

String sp="{call sample1..GetUnitReferenceMap}"; 
0

還有一個可能性進行檢查。這裏列出,因爲它只是發生在我身上,並沒有提及;-)

我不小心在名稱的末尾添加了空格字符。 在我終於注意到它之前,我嘗試了許多個小時。在你弄明白之後總是很簡單。