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

时间:2018-02-27 18:55:42

标签: stored-procedures table-valued-parameters

我有一个商店程序&它有4个参数。两个参数是用户通过的表值参数。输出其他两个参数。一个是字符串数据类型,变量名称是message&另一种是int数据类型也是由status.o我想通过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};

1 个答案:

答案 0 :(得分:0)

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

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

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?