0

私は次のようなprocを持っています

CREATE PROCEDURE [dbo].[ExportTestAsXML]
    @TestId         int
AS
BEGIN
    SET NOCOUNT ON;

    declare @x xml;
    set @x = (
       select
          (select * from table1 where testid = @TestId FOR XML auto, Type, Elements),
          (select * from table2 where testid = @TestId FOR XML auto, Type, Elements),
          (select * from table3 
           where objectiveid in 
               (select objectiveid from objectives where testid = @TestId) 
           FOR XML auto, Type, Elements),
          (select * from table4 
           where objectiveid in 
               (select objectiveid from objectives where testid = @TestId) 
           FOR XML auto, Type, Elements),
          (select * from table5 
           where questionid in 
               (select questionid from questions 
                where objectiveid in 
                      (select objectiveid from objectives where testid = @TestId)
               ) 
           FOR XML auto, Type, Elements)
       for xml path(''), type
    );

   select @x as my_xml
END

SQL Server 2005 Management Studioから実行すると、selectステートメントから結合されたXMLを含む単一のレコードを含むテーブルが表示されます。Webサービスコードから実行し、データテーブルビジュアライザーを使用してテーブルをチェックすると、テーブルは空になります。これが私がprocを実行するために使用するコードです

SqlParameter[] Parameters = new SqlParameter[1];
Parameters[0] = new SqlParameter();
Parameters[0].ParameterName = "@TestId";
Parameters[0].Value = TestId;
Parameters[0].SqlDbType = SqlDbType.Int;
Parameters[0].Size = 50;

DataTable data = ExecuteDataSet("ExportTestAsXML", Parameters);

private DataTable ExecuteDataSet(string storedProcName, SqlParameter[] parameters)
{
    SqlCommand command = new SqlCommand();
    command.CommandText = storedProcName;
    command.Parameters.AddRange(parameters);
    command.CommandType = CommandType.StoredProcedure;
    command.Connection = (SqlConnection)dcMUPView.Connection;

    command.Connection.Open();
    command.Prepare();

    SqlDataAdapter adapter = new SqlDataAdapter(command);
    DataTable ds = new DataTable();
    adapter.Fill(ds);

    command.Connection.Close();
    return ds;
}

何が起こっているのか分かりますか?

4

1 に答える 1

1

DataSetの代わりに aを入力すると、サンプルが機能しますDataTable

これは、必要最小限の変更を加えたソースのコピーです。DataSetを使用している場合は、テーブルが返されたかどうか、最初のテーブルに利用可能な行があるかどうかなどを確認するコードを追加する必要があることに注意してください。

発信者:

SqlParameter[] Parameters = new SqlParameter[1];
Parameters[0] = new SqlParameter();
Parameters[0].ParameterName = "@TestId";
Parameters[0].Value = TestId;
Parameters[0].SqlDbType = SqlDbType.Int;
Parameters[0].Size = 50;

DataSet data = ExecuteDataSet("ExportTestAsXML", Parameters);

// Read First table (Tables[0]), First Row (Rows[0]), First Column of that Row (Rows[0][0])
System.Diagnostics.Debug.Write(data.Tables[0].Rows[0][0]);

方法:

private DataSet ExecuteDataSet(string storedProcName, SqlParameter[] parameters)
{
    SqlCommand command = new SqlCommand();
    command.CommandText = storedProcName;
    command.Parameters.AddRange(parameters);
    command.CommandType = CommandType.StoredProcedure;
    command.Connection = (SqlConnection)dcMUPView.Connection;

    command.Connection.Open();
    command.Prepare();

    SqlDataAdapter adapter = new SqlDataAdapter(command);
    DataSet ds = new DataSet ();
    adapter.Fill(ds);

    command.Connection.Close();
    return ds;
}
于 2012-05-15T18:57:37.867 に答える