我有一个存储过程,它已经过良好的测试,可以在 SQL Server Management Studio 中完美运行。该过程所做的只是检查表中是否存在记录,如果存在则返回它,或者创建它然后如果不存在则返回它。
该过程如下所示:
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,但我认为这不应该起作用;我更喜欢使用数据表(在某些情况下可能会导致不止一行),而不是使用数据读取器并循环数据以获取结果。
关于为什么这可能会失败的任何建议?我查看了这个网站和其他类似网站上的几篇帖子,但没有找到满意的答案。非常感谢任何建议。
谢谢,
加里
整个 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 中完全独立运行。