使用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 命令?