C# 从C传递时收到的SQL Out参数为null#

C# 从C传递时收到的SQL Out参数为null#,c#,sql,sql-server,stored-procedures,ado.net,C#,Sql,Sql Server,Stored Procedures,Ado.net,我试图在out参数中填充一个值,但它从存储过程返回为null 但是当我尝试通过SSM运行查询时,它工作得很好 存储过程: CREATE PROCEDURE [dbo].[USP_ABCD] (@signal_xml AS NVARCHAR(MAX) OUT) -- this parameter includes the result in case AS BEGIN DECLARE @signal_data XML SET @signal_data = cast(@

我试图在
out
参数中填充一个值,但它从存储过程返回为null

但是当我尝试通过SSM运行查询时,它工作得很好

存储过程:

CREATE PROCEDURE [dbo].[USP_ABCD]
    (@signal_xml AS NVARCHAR(MAX) OUT)   -- this parameter includes the result in case
AS
BEGIN
    DECLARE @signal_data XML

    SET @signal_data = cast(@signal_xml as XML)

    INSERT INTO DBLog  
    VALUES ('USP_ABCD', 'test', @signal_xml, ERROR_MESSAGE(), GETUTCDATE())

    SET @signal_xml = 'ABCD';
END
private static void runSP()
{
    try
    {
        var temp = File.ReadAllText(@"abcd\TEST1.txt");
        var conStr = System.Configuration.ConfigurationManager.ConnectionStrings["test"].ConnectionString;

        using (SqlConnection connection = new SqlConnection(conStr))
        {
            connection.Open();

            SqlCommand command = connection.CreateCommand();

            // Setup the command to execute the stored procedure.
            command.CommandText = "dbo.USP_ABCD";
            command.CommandType = CommandType.StoredProcedure;

            // Set up the output parameter to retrieve the summary.
            SqlParameter paramSignalXml = new SqlParameter("@signal_xml", SqlDbType.NVarChar, -1);
            paramSignalXml.Direction = ParameterDirection.Output;
            paramSignalXml.Value = temp;
            command.Parameters.Add(paramSignalXml);

            // Execute the stored procedure.
            command.ExecuteNonQuery();

            Console.WriteLine((String)(paramSignalXml.Value));
            var retValue = (String)(paramSignalXml.Value);

            connection.Close();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
调用此存储过程的C#代码:

CREATE PROCEDURE [dbo].[USP_ABCD]
    (@signal_xml AS NVARCHAR(MAX) OUT)   -- this parameter includes the result in case
AS
BEGIN
    DECLARE @signal_data XML

    SET @signal_data = cast(@signal_xml as XML)

    INSERT INTO DBLog  
    VALUES ('USP_ABCD', 'test', @signal_xml, ERROR_MESSAGE(), GETUTCDATE())

    SET @signal_xml = 'ABCD';
END
private static void runSP()
{
    try
    {
        var temp = File.ReadAllText(@"abcd\TEST1.txt");
        var conStr = System.Configuration.ConfigurationManager.ConnectionStrings["test"].ConnectionString;

        using (SqlConnection connection = new SqlConnection(conStr))
        {
            connection.Open();

            SqlCommand command = connection.CreateCommand();

            // Setup the command to execute the stored procedure.
            command.CommandText = "dbo.USP_ABCD";
            command.CommandType = CommandType.StoredProcedure;

            // Set up the output parameter to retrieve the summary.
            SqlParameter paramSignalXml = new SqlParameter("@signal_xml", SqlDbType.NVarChar, -1);
            paramSignalXml.Direction = ParameterDirection.Output;
            paramSignalXml.Value = temp;
            command.Parameters.Add(paramSignalXml);

            // Execute the stored procedure.
            command.ExecuteNonQuery();

            Console.WriteLine((String)(paramSignalXml.Value));
            var retValue = (String)(paramSignalXml.Value);

            connection.Close();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

是否无法将值传递给输出参数,或者我是否遗漏了什么?有人能帮我吗?提前感谢。

您在C#中传递参数的方式看起来不错,但是如果您希望
设置@signal_data=cast(@signal_xml as xml)
对分配给
value
属性的
temp
值进行操作,则需要使用
参数direction.InputOutput
。然后需要在
INSERT
语句中使用
@signal\u data
。更好的是,如果
temp
包含XML,则将其作为XML参数传递,并使用另一个参数作为文本输出。您的代码似乎没有问题。但是您可以尝试使用
var retValue=Convert.ToString(paramSignalXml.Value)