存储过程有效,但在 c# 中给出无效列

Posted

技术标签:

【中文标题】存储过程有效,但在 c# 中给出无效列【英文标题】:Stored procedure works, but gives invalid column in c# 【发布时间】:2017-11-06 12:08:11 【问题描述】:

当我在 SMSS 中运行下面的存储过程时,它可以工作并返回一个不错的结果。

SQL:

EXEC @return_value = [dbo].[xxxxxx_EnergiAllTags]
    @SegmentResponseID = 'xxxxxxxxxx'

但是当我尝试从我的 C# 代码运行存储过程时,我得到一个错误:

列名“值”无效

这是我的代码:

 public DataSet GetQuery(string batchNr)
 
        SqlConnection conn = new SqlConnection("xxxxxxxx");
        SqlCommand command = new SqlCommand("xxxxxx_EnergiAllTags", conn);
        SqlDataAdapter da = new SqlDataAdapter(command);
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add(new SqlParameter("@SegmentResponseID", batchNr));

        DataSet ds1 = new DataSet();
        command.CommandTimeout = 60000;

        try
        
            da.Fill(ds1);
            return ds1;
        
        catch (Exception e)
        
            string ex = e.Message;
            throw;
        
    

任何可能有线索的人可以帮助我找出问题所在吗?

****更新为请求*****

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[xxxxxx_EnergiAllTags]
    @SegmentResponseID AS VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    CREATE TABLE #temp (TagName NVARCHAR(MAX),
                        StartValue NVARCHAR(MAX),
                        EndValue NVARCHAR(MAX),
                        Usage NVARCHAR(MAX)
                       )

    INSERT INTO #temp 
        EXEC [dbo].[xxxxxx_EnergyTagForBatch] @BatchID = @SegmentResponseID, 
@TagName = 'T06C02D01E02FQ000.PV'

    INSERT INTO #temp 
        EXEC [dbo].[xxxxxx_EnergyTagForBatch] @BatchID = @SegmentResponseID, 
@TagName = 'T06C02D01E02FQ001.PV'

    SELECT * From #temp
    DROP TABLE #temp
END

【问题讨论】:

你能分享xxxxxx_EnergiAllTags的代码吗?你希望它返回什么输出? 我认为我们还需要查看存储过程的代码。你有一个名为Value 的专栏吗?如果是这样,请尝试用方括号括起来 - [Value] Value 是 t-sql 中的关键字,该类型名称使用方括号,例如:[Value]。 你确定两者都在同一个数据库中运行吗? 能否暂时注释掉 INSERT 并重试?从第一个 INSERT 到 #temp 上的 SELECT 之前的所有代码。这是找出问题出在您的 C#、您向我们展示的过程或调用的过程中的简单方法。 【参考方案1】:

好的,我已经找到了问题所在。

我的 2 SP 都有一个名为 #temp 的临时表,虽然我认为它们应该本地化到每个实例,但它们不是,而且是混合的,到那时它们给出了错误。

解决方法,请确保您可能调用的存储过程字符串中没有使用同名的临时表。

【讨论】:

以上是关于存储过程有效,但在 c# 中给出无效列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 导入和导出向导在使用临时表的存储过程中给出无效对象错误

使用 C# 和存储过程从 SQL Server 检索 VarChar(MAX)

如何从存储过程中返回 Varchar2

SQL Server 存储过程在查询分析器中执行,但在 C# 中无法正常运行

存储在 plist 中的数据在模拟器中有效,但在设备中无效

C#中使用Oracle存储过程返回结果集