2016-08-10 5 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ロールに追加することさえできます。

データベースレベルでは、[データベースユーザー]ダイアログの[セキュリティ]セクションに移動し、権限のあるユーザーに付与されたGrantおよびWith Grant権限を使用して問題のストアドプロシージャを実行しました。また、データベースのすべてのテーブルを削除、挿入、選択、および更新するために、ユーザーに「許可」権限を明示的に選択しました。

"XmlReader xrdr = cmnd.ExecuteXmlReader();" xrdr変数は空です。エラーは報告されません。誰かが私が調べる必要があるものについての提案をすることはできますか?

お手数ですがお寄せいただきありがとうございます。ここで

は(SQL Server Management Studioの中で完璧に動作します)ストアドプロシージャの簡易版である: AS

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

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

2つのデータベースがありますか?おそらく間違ったものにアクセスしているのでしょうか? –

+1

手続きを投稿できますか?上に行くことがなければ、これはかなり挑戦的です。 –

+3

Sqlプロファイラを実行します。クエリは実行されていますか?それは正しい値を返していますか? – stuartd

答えて

-1

をBEGIN私はあなたのStoredProcedureを想定すでに必要なフィールドがあります。だから、 、この試してください:あなたのC#コードで次に

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

SET @Param1 = (SELECT XML from TABLE) 

あなたの手順では、あなたのパラメータは、出力のparamとして定義されていることを確認します

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

多分これを試してみてください

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

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

明らかに、データ型を適切なものに調整します。また、この手順で作業している場合は、XMLReaderを使用するのではなく、ExecuteNonQueryを使用することになります。

関連する問題