2016-08-10 31 views
-2

我已經編寫了一個返回XML的存儲過程。當我在SQL Server管理工作室中運行存儲過程時,它會根據需要返回xml,但是,當我在C#代碼中運行它時,不會返回xml。我的代碼如下所示:SQL Server存儲過程不會在VS C#中返回結果,但會在SQL Server中執行

using (SqlConnection conn = new SqlConnection(connStr)) { 
    using (SqlCommand cmnd = new SqlCommand("dbo.spMyStoredProcXML", conn)) { 
     cmnd.CommandType = CommandType.StoredProcedure; 
     cmnd.Parameters.Add("@Param1", SqlDbType.VarChar, 50); 
     cmnd.Parameters["@Param1"].Value = "Some value"; 
     //more parameters... 
     conn.Open(); 
     XmlReader xrdr = cmnd.ExecuteXmlReader(); 
     //do stuff... 
    } 
} 

我已簽了,我創建的用戶的權限,他們是這樣的: 在服務器級別,在登錄屬性對話框中,在用戶映射,我已經映射用戶訪問正確的數據庫,然後「檢查」公共db_datareader,db_datawriter,然後將它們添加到db_owner角色。

在數據庫級別,我也進入了數據庫用戶對話框的「安全性」部分,並明確給出用戶授予權限和授予權限以執行相關存儲過程。我還爲用戶明確選擇了「授予」權限以刪除,插入,選擇和更新數據庫中的所有表。

還是,當「XmlReader xrdr = cmnd.ExecuteXmlReader();」行運行時,xrdr變量是空的。沒有錯誤報告。有人可以提出一些建議,我還需要檢查什麼?

在此先感謝您提供的任何幫助。

這裏是存儲過程的簡化版本(在SQL Server Management Studio中完美的作品):

CREATE PROCEDURE [dbo].[spGetXML] 
(@param1 varchar(50), @param2 varchar(1)) 

AS BEGIN

SET NOCOUNT ON; 
with xmlnamespaces ('http://schemas.xmlsoap.org/soap/encoding/' as SOAP_ENC) 
select 
    d.Col1, 
    d.Col2, 
from MyTable d 
where d.Col1 = @param1 and 
     d.Col2 = @param2 
FOR XML PATH('ObjectName'), root('DOCUMENT'), type 

END

+1

你有兩個數據庫嗎?並可能訪問錯誤的? –

+1

你可以發佈程序嗎?如果沒有繼續下去,這是非常具有挑戰性的。 –

+3

運行Sql Profiler。查詢是否正在執行?它是否返回適當的值? – stuartd

回答

-1

我想你的StoredProcedure已經有必要的領域。 所以,試試這個:

using (SqlConnection conn = new SqlConnection(connStr)) { 
    conn.Open(); 
    using (SqlCommand cmnd = new SqlCommand("dbo.spMyStoredProcXML", conn)) { 
    cmnd.CommandType = CommandType.StoredProcedure; 
    cmnd.Parameters.AddWithValue("@Param1", "Some value";) 
     //more parameters... 
    XmlReader xrdr = cmnd.ExecuteXmlReader(); 
     //do stuff... 
    } 
    } 
+1

這不是問題的答案:據我所知,你所做的全部都是將調用移至'Open()'並替換爲'AddWithValue(...)'? – stuartd

+0

問題的答案可能會提供一些最佳方法(如AddWithValue),更重要的是提供問題的解決方案。如果例程錯了,我發現有更好的方法去做,那有什麼問題?無論如何,我真的認爲StoredProcedure已經有了必要的參數。所以,如果是這種情況,原始代碼將會失敗。 –

+0

AddWithValue肯定_convenient_,但[認爲是有害的(http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/),而不是因此「最好的方法「,除了你的意見。你的答案是「爲問題提供解決方案」在哪裏?你可能會認爲你的方式是一種更好的方式,但是如果你不能回答這個問題,那麼你應該將它作爲評論發佈。 – stuartd

-1

也許試試這個:

在你的程序中確保您的參數定義爲輸出參數:

CREATE PROCEDURE [dbo].[MyStoredProcedure] 
@Param1 xml OUTPUT 

SET @Param1 = (SELECT XML from TABLE) 

然後在你的C#代碼:

cm.Parameters.Add("@Param1", SqlDbType.Xml).Direction = ParameterDirection.Output; 

Param1 = Convert.ToString(cm.Parameters["@Param1"].Value); 

顯然,請將您的數據類型調整爲適合的值。另外,如果你在這個過程中做了很多工作,我會親自使用ExecuteNonQuery而不是使用XMLReader

相關問題