2011-07-14 27 views
2

我有一個令人難以置信的奇怪問題,我一直試圖修復幾乎一天,現在我正對着磚牆,需要幫助!ASP.NET存儲過程調用沒有行,但在管理工作室!

我創建了一個.NET 4的C#網站我Windows 7的PC上,新安裝的SqlServer 2008速成R2,和一切工作正常。

我已經上傳了數據庫和網站。 該網站現在位於Windows Web Server 2008 R2(帶有Service Pack 1) 該數據庫位於不同的服務器上運行Windows Server 2008 R2 Standard與SQL Server 2008 R2。

網站的其他部分運行良好,連接到數據庫罰款,除了一頁,我已經縮小到一個存儲過程調用沒有返回行。

我已經簡化調用此:

DataSet ds = new DataSet(); 
     SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString()); 
     SqlCommand cmd = new SqlCommand("MYSP 'param1', param2, param3", conn); 
     cmd.CommandType = CommandType.Text; 
     conn.Open(); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(ds); 
     Response.Write("ROWS COUNT IN GET DS " + ds.Tables[0].Rows.Count); 
     conn.Close(); 
     cmd.Dispose(); 
     return ds; 

對於上述的任何的,如果我我反對它返回2行數據庫的精確副本,在本地計算機上運行此,如果我直接運行在活動服務器上的Sqlserver Management Studio中,它返回2行,但如果我通過ASP.net在實時服務器上運行它,它將返回任何行!

任何人都可以擺脫任何光?我瘋了!

更新即使我使用命令式的文字,我已經嘗試過與分離PARAMS命令類型的存儲過程(如下),但它並沒有區別

cmd.CommandType = StoredProcedure; 
    cmd.Parameters.Add(new SqlParameter("@param1", param1)); 
      cmd.Parameters.Add(new SqlParameter("@param2", param2)); 
      cmd.Parameters.Add(new SqlParameter("@param3", param3)); 

UPDATE

謝謝大家的意見!

答案是:

,該網站使用設置爲「英英」(默認)數據庫用戶。我沒有意識到這一點,因爲它是一個新的服務器!

其他地方的用戶都設置爲「英文」,所以將用戶改爲英文可以修復它!

+0

myConn是否存在於該服務器的web.config中?有效的cridentials? – David

+0

@David感謝您的答案,是的,它是有效的,因爲其他sps工作正常 – Bex

回答

5

通常的事情要嘗試:當你登錄到數據庫來運行你的查詢,你是否這樣做,因爲asp.net進程正在使用的SAME用戶?你可能會發現,如果你使用兩個用戶,他們可能會有不同的設置(一個是EN-GB,一個是EN-US),這會給你奇數的日期問題?另外,你可能會發現兩個priveldges是不同的,所以你會有tempDb權限,另一個不是?

+0

好的,答案部分是這個,我的同事寫的SP令人毛骨悚然。 !活動服務器的用戶默認爲「英式英語」,而其他地方則爲「英語」,存儲過程會執行一些日期解析!所以我把我的數據庫用戶改爲「英文」,一切都很好!好極了! – Bex

+0

謝謝您的投票。我在這裏說了很多經驗,因爲這總是發生在我們的服務器上! ;-) – Oxonhammer

2

如果是你調用一個存儲過程,你應該SqlCommand.CommandType設置爲存儲過程:

DataSet ds = new DataSet(); 

using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString())) 
using(SqlCommand cmd = new SqlCommand("MYSP 'param1', param2, param3", conn)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; <== STORED PROCEDURE !! 
    ...... 

} 

更新:因爲你執行與參數的存儲過程,你應該用這個代替:

using(SqlCommand cmd = new SqlCommand("exec dbo.MYSP 'param1', param2, param3", conn)) 

然後再用CommandType.Text

+0

我知道這通常是這種情況,但我通過我的參數與SP(用於測試目的),所以它實際上是文本。如果我將其更改爲存儲過程,則會引發錯誤,指出「無法找到存儲過程MYSP,param1,param2,param3」。無論哪種方式,它在我的本地機器上工作正常 – Bex

+0

@Bex:那麼你需要分別添加參數......或將「文本」更改爲'exec MYSP .......' –

+0

這是如何活網站之前,我試圖縮小我的問題(我的意思是單獨的參數),但它沒有返回。這就是爲什麼我將它改爲純文本。而且它仍然可以在我的本地機器上正常工作! – Bex

1

使用SQL Server Profiler來捕獲生產ASP.NET服務器發出的實際存儲過程調用,然後針對您的開發設置執行相同的操作。確保參數輸入相同。

如果參數在該級別匹配,似乎可能的唯一答案是,您的同事的複雜SP有一些非確定性組件,它會使您的結果搞砸。你瞭解整個SP嗎?

1

好的,在這裏狂野的拍攝,但我注意到你在做ds.Tables[0].Rows.Count,我不知道你的存儲過程是否返回多個數據表?到目前爲止,最好的答案是從@pseudocoder使用分析器來查看實際調用的內容。我還建議在代碼中加入一個斷點並檢查正在返回的數據集。

相關問題