我有一個存儲過程,它已經過很好的測試,並且可以在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中獨立運行。
你能否提供你的存儲過程的代碼? –
我們沒有看到SP的所有代碼。 INSERT部分中執行的最後一個命令是剛剛插入的記錄的SELECT?你能展示這部分存儲過程嗎? – Steve
以下是SP的結尾: – Gary