【问题标题】:calling a stored procedure from C# using SqlDataAdapter使用 SqlDataAdapter 从 C# 调用存储过程
【发布时间】:2012-06-05 15:39:30
【问题描述】:

我有一个存储过程,它已经过良好的测试,可以在 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 中完全独立运行。

【问题讨论】:

  • 能否也提供存储过程的代码?
  • 我们没有看到 SP 的所有代码。在 INSERT 部分执行的最后一个命令是刚刚插入的记录的 SELECT 吗?你能展示这部分存储过程吗?
  • 存储过程确实对 ORACLE 数据库进行了 OPENQUERY 调用。我不明白为什么这很重要。换句话说,它是连接来自两个不同数据库、一个 SQL Server、一个 Oracle 的表。

标签: c# sql dataadapter


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多