使用SqlDataAdapter从C#调用存储过程

时间:2012-05-31 11:23:20

标签: c# sql dataadapter

我有一个经过充分测试的存储过程,并且可以从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后检查表的结果。当行存在于表中时它可以正常工作,但如果它不存在,并且存储的proc需要生成它,则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中完全独立运行。

1 个答案:

答案 0 :(得分:2)

问题解决了。事实证明,传递给Oracle的OpenQuery字符串是将空字符串转换为NULL并阻止返回新行。我需要添加的是检查NULL和空字符串:

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