2016-09-29 143 views
0

我遇到了一個問題,即在執行特定的SQL Server存儲過程時SqlDataAdapter沒有填充DataTable,儘管事實上我有許多類似的函數執行幾乎相同的存儲過程,所有這些都正常工作。SqlDataAdapter沒有填充DataTable

這是運行存儲過程並返回填充的函數DataTable;

public DataTable getAssetClassifications(int? pLevel) 
{    
    // Create dataTable to hold data 
    var dt = new DataTable(); 

    // Initialize connection 
    using (connection = new SqlConnection(connectionString)) 
    using (SqlCommand command = connection.CreateCommand()) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
    { 
     // Open connection 
     connection.Open(); 

     // Set connection properties 
     command.CommandText = "BR_Manage_Primary_Classification_GetItemsAssets"; 
     command.CommandType = CommandType.StoredProcedure; 

     // Add params 
     command.Parameters.AddWithValue("@pLevel", pLevel); 

     // Create return value parameter 
     SqlParameter returnValue = new SqlParameter(); 
     returnValue.Direction = ParameterDirection.ReturnValue; 

     // Add return value to command 
     command.Parameters.Add(returnValue); 

     // Execute command 
     command.ExecuteNonQuery(); 

     // Fill DataTable 
     adapter.Fill(dt); 

     // Get result 
     var result = returnValue.Value; 

     Console.WriteLine("Get asset classifications result: " + result.ToString()); 

     if (result.Equals(0)) 
     { 
      return dt; 
     } 
    } 

    return null;  
} 

pLevel = null一起運行將返回null,它應返回一個382行記錄集。從調試中我可以看到,'adapter.fill(dt)'返回382,因爲它應該,但DataTable'dt'未被填充。

存儲過程如下所示:

CREATE PROCEDURE BR_Manage_Primary_Classification_GetItemsAssets 
/* 
TODO: Allow for subsets based on tree branches 
*/ 
    @pLevel AS INT = NULL 
AS 
BEGIN 
/*  
    Description: Independently returns asset classifications 

     exec BR_Manage_Primary_Classification_GetItemsAssets 

    Outputs: None 

    NOTE: This BR doesn't write, so it doesn't audit but it does error log the call to the DAL. 

*/ 
    SET xact_abort, nocount on 
    DECLARE @StoredProcedureName AS SYSNAME = quotename(object_schema_name(@@procid))+'.'+quotename(object_name(@@procid)) 
    DECLARE @Parameters AS NVARCHAR(1000) = 'Parameters: ' 
    DECLARE @LocalError AS INT 
    DECLARE @LocalErrorMessage AS NVARCHAR(2048) 
    DECLARE @NewAuditID AS INT = NULL 

BEGIN TRY 
    BEGIN TRANSACTION 
     EXEC DAL_Primary_Classification_GetItemsAssets 
    COMMIT TRANSACTION 

    -- Return SUCCESS 
    RETURN 0 
END TRY 
BEGIN CATCH 
    -- On fail close any open transactions and write to Error Log 
    SET @LocalError = @@ERROR 
    SET @LocalErrorMessage = ERROR_MESSAGE() 

    IF @@trancount > 0 
     ROLLBACK TRANSACTION 

    -- Actual error logging 
    EXEC DAL_System_LogError null, @StoredProcedureName, @LocalError, @LocalErrorMessage, @Parameters, null, null, null 

    -- Return Error 
    RETURN 1 
END CATCH 
END 

這將調用DAL:

CREATE PROCEDURE [dbo].[DAL_Primary_Classification_GetItemsAssets] 
as 
begin 
    /* 
    Description: Returns all assets 

      exec [DAL_Primary_Classification_GetItemsAssets] 

      exec DAL_Primary_Classification_GetItems 3, 4 

    Outputs: None 

*/ 
set nocount on; 

select c.id as rule_id, 
     c.[Description] as rule_description, 
     c.Comment as rule_comment, 
     l91.id as L91_IDm, 
     l91.name as L91_Name, 
     l91.[Description] as L91_Description, 
     l91.Comment as L91_Comment, 
     l92.id as L92_ID, 
     l92.name as L92_Name, 
     l92.[Description] as L92_Description, 
     l92.Comment as L92_Comment 

from Classifications_Assets as c 
      left outer join Class_L9_1 as l91 on c.Class_L9_1_ID = l91.ID  and l91.Deleted = 0 
      left outer join Class_L9_2 as l92 on c.Class_L9_2_ID = l92.ID  and l92.Deleted = 0 
where c.Deleted = 0 
end 

對不起,文字的牆壁,任何幫助將不勝感激!

+0

您是否在調試器中檢查過'resultValue'的值? –

+0

結果值返回0表示成功,這很好 –

回答

0

在這樣的回答: https://stackoverflow.com/a/14816172/4519548

的傢伙添加參數略有不同。他將SqlDbType.Int傳遞給Add方法:

SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 
    cmd.ExecuteNonQuery(); 

    int id = (int) returnParameter.Value; 

也許這會幫助你。

1

我想我誤解了你對我的其他答案。

我看你在adapter.Fill(dt)之前打電話ExecuteNonQuery

您需要撥打ExecuteNonQuery嗎?

你可以在沒有它的情況下測試嗎?

+0

是的只是看了一下,它沒有什麼區別,雖然我想我可能會嘗試使用讀者來看看是否有任何區別 –

+0

這很糟糕...... :( –

+0

也許問題在於調用另一個SP調用的SP,是否僅使用一個SP來嘗試它? 我不確定您是否可以從exec執行到外部exec執行結果(這很讓人困惑) –