使用ado.net将多个SQL表值参数传递到单个存储过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ado.net将多个SQL表值参数传递到单个存储过程相关的知识,希望对你有一定的参考价值。

我有一个单一的存储过程,它有4个参数。两个参数是用户传递的表值参数和其他两个参数输出。一个是字符串数据类型,变量名称是消息,另一个是int数据类型,也是按状态命名的。所以我想通过ado.net传递4个参数。但我不知道为什么vs显示这个错误。

“操作数类型冲突:dbo.tvpPurchase与dbo.tvpPurchaseDetail不兼容”

这是我的代码,如下所示

        string connectionString = GetConnectionString();
        var status = 0;
        var message = "";
        using (SqlConnection connection = new SqlConnection())
        {
            connection.ConnectionString = connectionString;

            connection.Open();
            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandText = "dbo.spPurchaseDataMaipulation";
                command.CommandType = CommandType.StoredProcedure;

                SqlParameter parameter;
                parameter = command.Parameters.AddWithValue("@purchaseType", CreateSqlDataRecordsForPurchase(purlist));
                Parameter = Command.Parameters.AddWithValue("@purchaseDetailType", CreateSqlDataRecordsForPurchaseDetail(purDetai));
                Command.Parameters.Add("@message", SqlDbType.VarChar, 500);
                Command.Parameters["@message"].Direction = ParameterDirection.Output;
                Command.Parameters.Add("@status", SqlDbType.Int);
                Command.Parameters["@status"].Direction = ParameterDirection.Output;
                parameter.SqlDbType = SqlDbType.Structured;
                parameter.TypeName = "dbo.tvpPurchase";
                parameter.TypeName = "dbo.tvpPurchaseDetail";
                command.ExecuteNonQuery();
                connection.Close();
                status = Convert.ToInt32(Command.Parameters["@status"].Value);
                message = Command.Parameters["@message"].Value.ToString();
            }
        }

        return new { status = status,message = message};
答案

问题是您对两个表值参数使用相同的引用。您可以避免这个问题并简化您的代码。

您可以简单地使用AddWithValue的重载 - 而不是使用Add - 它返回对您刚刚添加的参数的引用。这将使您的代码更短更容易:

using (SqlCommand command = connection.CreateCommand())
{
    command.CommandText = "dbo.spPurchaseDataMaipulation";
    command.CommandType = CommandType.StoredProcedure;

    SqlParameter parameter;
    command.Parameters.Add("@purchaseType", SqlDbType.Structured).Value = CreateSqlDataRecordsForPurchase(purlist);
    command.Parameters.Add("@purchaseDetailType", SqlDbType.Structured).Value = CreateSqlDataRecordsForPurchaseDetail(purDetai);
    Command.Parameters.Add("@message", SqlDbType.VarChar, 500).Direction = ParameterDirection.Output;
    Command.Parameters.Add("@status", SqlDbType.Int).Direction = ParameterDirection.Output;
    command.ExecuteNonQuery();
    connection.Close();
    status = Convert.ToInt32(Command.Parameters["@status"].Value);
    message = Command.Parameters["@message"].Value.ToString();
}

进一步阅读:Can we stop using AddWithValue() already?

以上是关于使用ado.net将多个SQL表值参数传递到单个存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义子查询传递给 ADO.NET 中的 SQL 命令?

意图服务中的多个异步 Ado.net sql 插入

在使用表值参数时如何将多个参数一起传递给存储过程

如何从.net代码将表值参数传递给存储过程

有没有一种方便的方法可以使用 ADO .NET 将数据从单个列获取到集合中?

通过在 SQL Server 2000 中传递变量参数来加入表值函数