2012-05-31 42 views
1

我有一個存儲過程,它已經過很好的測試,並且可以在SQL Server Management Studio中完美工作。所有的過程都是檢查表中是否存在記錄,如果存在,則返回它,或者創建它,如果不存在,則返回它。從C#使用SqlDataAdapter調用存儲過程

的過程是這樣的:

CREATE proc [dbo].[spInsertSerialBatch] 

@MOS_JOB varchar(12), --PASSED COMMAND LINE 
@MOS_LOT varchar(4) = NULL, --PASSED COMMAND LINE 
@MES_USER varchar(12) = 'NOT PASSED',--PASSED COMMAND LINE 
@COMPUTERNAME varchar(100) = 'NOT PASSED' --ENVIRONMENT VARIABLE 

as .... 

我用一個SqlDataAdapter,我已經反覆使用沒有任何問題。設置看起來像這樣:

using (SqlCommand sqlComm = new SqlCommand("dbo.spInsertSerialBatch", serialBatchDataConnection)) 
        { 
         if (serialBatchDataConnection.State != ConnectionState.Open) 
         { 
          serialBatchDataConnection.Open(); 
         } 



sqlComm.CommandType = CommandType.StoredProcedure; 
        sqlComm.Parameters.AddWithValue("@MOS_JOB", options.jobNumber); 
        sqlComm.Parameters.AddWithValue("@MOS_LOT", options.lotNumber); 
        sqlComm.Parameters.AddWithValue("@MES_USER", options.userId); 
        sqlComm.Parameters.AddWithValue("@COMPUTERNAME", System.Environment.MachineName); 

        SqlDataAdapter sda = new SqlDataAdapter(sqlComm); 
        DataTable dt = new DataTable(); 

        int rowsAffected = sda.Fill(dt); 

} 

然後,我在執行Fill之後檢查表的結果。它在表中存在該行時正常工作,但如果不存在,並且存儲過程需要生成該表,則Fill返回0行,並且數據表保持爲空。沒有錯誤/異常被拋出,我只是沒有結果。

我想我可以改變代碼來使用ExecuteNonQuery,而不是使用DataAdapter,但我沒有理由認爲這不應該工作;我更喜歡使用數據表(這可能導致在一些情況下多於一行)比使用數據讀取器和循環數據以獲得結果。

任何有關爲什麼這可能會失敗的建議?我查看過這個和其他類似網站上的多個帖子,但還沒有找到滿意的答案。任何建議,非常感謝。

感謝,

加里

的entrire SP是相當大的,可能過於專有發佈...

 --return inserted rows 
     SELECT 'CREATED' as [spRESULT], o.* 
     FROM @output o 

     END   

/* 
    * Return existing SerialBatch(s) 
    */ 
    BEGIN 

     SELECT 'RETRIEVED' as [spRESULT], s.* 
     FROM SerialBatch s 
     WHERE SerialBatchId = @formattedId 

     UNION 
     /* 
     * pull in products that have components that need labels as well 
     */ 
     SELECT 'RETRIEVED' as [spRESULT],s.* 
     FROM SerialBatch s 
     WHERE SerialBatchParentId = @formattedId 
    END 

這是存儲過程的結束。我試圖執行一個DataReader,結果是一樣的......當sp創建它時,我沒有得到任何結果,但它又一次在SQL Server Management Studio中獨立運行。

+0

你能否提供你的存儲過程的代碼? –

+0

我們沒有看到SP的所有代碼。 INSERT部分中執行的最後一個命令是剛剛插入的記錄的SELECT?你能展示這部分存儲過程嗎? – Steve

+0

以下是SP的結尾: – Gary

回答

2

問題解決了。原來,傳遞給Oracle的OpenQuery字符串將空字符串轉換爲NULL,並防止返回新行。所有我需要添加的是NULL和空字符串的檢查:

if @MOS_LOT IS NULL or @MOS_LOT = '' 
    set @MOS_LOT = ' ' --EMPTY STRINGS BEING EQUIVALENT TO NULLS