在C#中执行SQL查询时出错,当我手动输入它时没有错误

疯话

我正在c#中执行qry,当我从程序中运行它时返回此错误:

System.Data.dll中发生类型为'System.Data.SqlClient.SqlException'的第一次机会异常

和捕获SqlException时的异常:

'。'附近的语法不正确。

但是,当我在SQL Server中运行它并手动交换变量时,它运行良好。我觉得我缺少一些基本的东西,但我却盯着自己死了。

查询:

SELECT TOP 1 TempSelection.ErrorOccured
FROM
(
SELECT JL.CommandID AS cmdID, 
    CASE JL.Direction
        WHEN 1 THEN 'Out'
        WHEN 2 THEN 'In'
        WHEN 5 THEN 'ConcOut'
        ELSE 'Both' 
    END
    AS Direction,
    CH.ChannelName, A.Description AS AddressDescription, SG.SelectorGroupName, 
    CASE WHEN SML1.ID IS NOT NULL
            THEN SML1.FormatCode
            ELSE 
                CASE WHEN SML2.ID IS NOT NULL
                THEN SML2.FormatCode
                ELSE NULL 
                END 
    END 
    AS FormatCode,
    CASE WHEN SML1.ID IS NOT NULL
            THEN SML1.TypeCode
            ELSE 
                CASE WHEN SML2.ID IS NOT NULL
                THEN SML2.TypeCode
                ELSE NULL 
                END 
    END 
    AS TypeCode,
    CASE WHEN SML1.ID IS NOT NULL
            THEN CTP1Sender.PartnerName
            ELSE 
                CASE WHEN SML2.ID IS NOT NULL
                THEN CTP2Sender.PartnerName
                ELSE NULL 
                END 
    END 
    AS Sender,

        CASE WHEN SML1.ID IS NOT NULL
            THEN CTP1Recipient.PartnerName
            ELSE CASE 
            WHEN SML2.ID IS NOT NULL
                THEN CTP2Recipient.PartnerName
                ELSE NULL 
                END 
    END 
    AS Recipient,
    EL.ErrorDescription, EL.Assembly, EL.ErrorDetail, C.ErrorOccured


FROM
    @dbEnv.dbo.tbl_jobLog JL 
    LEFT JOIN @dbEnv.dbo.tbl_Commands C ON JL.CommandID = C.CommandID
    LEFT JOIN @dbEnv.dbo.tbl_ProcessFlows PF ON PF.ProcessFlowID = JL.ProcessFlowID 
    LEFT JOIN @dbEnv.dbo.tbl_ProcessFlowDefenitions PFD ON PFD.ProcessFlowDefID = JL.ProcessFlowDefID
    LEFT JOIN @dbEnv.dbo.tbl_Channels CH ON CH.ChannelID = JL.ItemID AND JL.ItemType LIKE 'CHA' AND CH.ChannelID IS NOT NULL
    LEFT JOIN @dbEnv.dbo.tbl_SelectorGroups SG ON SG.SelectorGroupID = JL.ItemID AND JL.ItemType LIKE 'SEL' AND SG.SelectorGroupID IS NOT NULL
    LEFT JOIN @dbEnv.dbo.tbl_ErrorLog EL ON JL.JobID = EL.JobID
    LEFT JOIN @dbEnv.dbo.tbl_inoutmessages IOM ON IOM.InOutMsgID = EL.InOutMsgID
    LEFT JOIN @dbEnv.dbo.tbl_Addresses A ON A.AddressID = IOM.AddressID 
    LEFT JOIN @dbEnv.dbo.tbl_StoredMessagesLog SML1 ON SML1.ID = IOM.StoreLinkID
    LEFT JOIN @dbEnv.dbo.VW_CodeToPartner CTP1Sender ON SML1.SenderCodeID = CTP1Sender.ID
    LEFT JOIN @dbEnv.dbo.VW_CodeToPartner CTP1Recipient ON SML1.RecipientCodeID = CTP1Recipient.ID  
    LEFT JOIN @dbEnv.dbo.tbl_StoredMessagesLog SML2 ON SML2.ID = EL.StoredmessagesID
    LEFT JOIN @dbEnv.dbo.VW_CodeToPartner CTP2Sender ON SML2.SenderCodeID = CTP2Sender.ID
    LEFT JOIN @dbEnv.dbo.VW_CodeToPartner CTP2Recipient ON SML2.RecipientCodeID = CTP2Recipient.ID

WHERE
CH.ChannelName {0}
AND A.Description {1}
AND SG.SelectorGroupName {2}
AND EL.ErrorDescription {3}
AND EL.Assembly {4}
AND EL.ErrorDetail {5}
) AS TempSelection
WHERE
Direction {6}
AND FormatCode {7}
AND TypeCode {8}
AND Sender {9}
AND Recipient {10}
";

字符串中的变量按以下方式填充:

SqlCommand cmd = new SqlCommand();
if (errorRow["Channel"] == null || errorRow["Channel"].ToString() == "")
{
    Channel = "IS NULL";
}
else
{
    Channel = "LIKE '@ChannelName'";
    param = new SqlParameter();
    param.ParameterName = "@ChannelName";
    param.Value = errorRow["Channel"].ToString();
    cmd.Parameters.Add(param);
}

之后,使用String.Format编辑字符串:

sqlCommand = String.Format(sqlCommand, Channel,...);
cmd.CommandText = sqlCommand;

最后是执行本身:

public static Boolean readLatestErrorOccured(SqlConnection sqlConn, SqlCommand sqlCommand)
    {
        try
        {
            sqlCommand.Connection = sqlConn;
            object obj = sqlCommand.ExecuteScalar();
            if (obj != null)
            {
                return Convert.ToBoolean(obj);
            }
        }
        catch (SqlException sqlEx)
        {
            MessageBox.Show("Error in readLatestErrorOccured: SqlException" + Environment.NewLine + Environment.NewLine + sqlEx.Message.ToString());
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error in readLatestErrorOccured" + Environment.NewLine + Environment.NewLine + ex.Message.ToString());
        }
        return false;
    }

PS:在语句中输入“ WITH(NOLOCK)”时,也会出现错误(例如:LEFT JOIN GFKN.dbo.tbl_Commands C WITH(NOLOCK)ON JL.CommandID = C.CommandID)。同样,qry在SQL Server中起作用,但不是在应用程序中起作用。

Edit1:至此,我基本上只是通过在命令文本和参数上输出一些调试信息来检查输出qry。qry的下部将如下所示:

WHERE
    CH.ChannelName LIKE '@ChannelName'
    AND A.Description IS NULL
    AND SG.SelectorGroupName IS NULL
    AND EL.ErrorDescription LIKE '@ErrorDescription'
    AND EL.Assembly LIKE '@Assembly'
    AND EL.ErrorDetail LIKE '@ErrorDetail'
    ) AS TempSelection
    WHERE
    Direction LIKE '@Direction'
    AND FormatCode IS NULL
    AND TypeCode IS NULL
    AND Sender IS NULL
    AND Recipient IS NULL

param @dbEnv:GFKN
param @ChannelName:FTP FR.DHL
param @ErrorDescription:A warning occured while receiving messages.
param @Assembly:Porthus.GoldFish.FTP
param @ErrorDetail:A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
param @Direction:In
詹姆斯·哈科特

您不能从C#中将@DbEnv作为此类参数提交!

使用string.format将@DbEnv放入您的SQL字符串中。

如果您尝试使用如下方式:

cmd.Parameters.AddWithValue("@dbEnv", "DatabaseName");

您将得到所看到的确切错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我没有收到手动运行代码的代码时,在Python for循环中收到KeyError

为什么当我输入这个 powershell 代码时它没有被执行?

SQL:SQL查询准备失败。但是在手动完成时执行

ModelState是有效的,但是当我保存数据时,会在有错误的entityValidationErrors中得到它

当我在mongodb中手动设置_id时,@ CreatedDate不起作用

当我尝试从WPF中的RichTextBox手动删除图像时,出现InvalidOperationException

同时找不到赛普拉斯页面,当我手动加载它时它可以工作

空手道 UI - 当我输入到期日期时,它没有正确使用

当我尝试使用Hibernate删除实体时,没有错误消息但没有删除

手动安装spark时出错

当我使用 IBKR API (Interactive Brokers) 手动进行交易时需要帮助打印执行细节

我的应用程序在构建时没有任何错误,但是当我在手机上运行它时它停止工作

没有git的手动输入

为什么当我给 R 中的两个列表元素赋予相同的名称时没有错误

为什么即使我在makefile中写了它,当我执行make时也没有-g选项(gdb)

使用错误的列名执行查询时没有错误

当我推入超过Vec容量的元素时,为什么没有错误?

当我手动调整浏览器大小时,媒体查询有效,但当我在Chrome的“检查”中使用“响应”功能时,媒体查询不起作用

动态创建的vue组件没有$ store参数如何在创建时手动添加它

当我有单逗号和|时,SQL语法中有错误。

当我在Mac终端中输入`route -n`时,为什么它没有显示路由表?

从 SQL Server 中的 XML 列中选择字段时,我没有得到结果也没有错误

当我向django添加新语言时,没有错误,但没有显示我的翻译。为什么?

我应该更换我的硬盘。自从过去几周我启动我的系统时,它变成了读保护,我必须手动执行 fsck

我的网站在 chrome 扩展中有响应,但是当我在手机中查看它时,它没有响应

休眠,当我使 id 列自动增加时,sql 有错误

实时服务器没有加载我的图像,但是当我手动打开我的文件 ex:index.html 时,我的图像已完全加载

python 3 中的语法错误,当我尝试转换日期但尝试解决它时没有运气

当我尝试执行脚本时出错:ImportError:没有名为tools的模块