调用存储过程后DataTable为空
DataTable is empty from calling stored procedure
我有一个接受 table 值参数的存储过程。当我在 SQL Server Management Studio 2014 中使用 table 值参数测试过程时,我得到了正确的返回值。
declare @NumberList as dbo.NumberList
insert into @NumberList(value) values (16101197);
insert into @NumberList(value) values (16101196);
insert into @NumberList(value) values (16101194);
insert into @NumberList(value) values (16101042);
insert into @NumberList(value) values (16101190);
insert into @NumberList(value) values (16101191);
--select value from @NumberList
exec GetClientLeadsByClientId @NumberList
但是,在我的 C# 代码中 DataTable
是空的。当我在 SQL Server Management Studio 中测试时,clientIds
与上面的值匹配。
private DataTable GetClientLeadsByClientIds(List<int> clientIds)
{
var dataTable = new DataTable();
var numberList = AddClientIdsToNumberListTemporaryTable(clientIds);
var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
using (var command = new SqlCommand("GetClientLeadsByClientId", connection) { CommandType = CommandType.StoredProcedure } )
using (var dataAdapter = new SqlDataAdapter(command))
{
var parameter = new SqlParameter();
parameter.ParameterName = "@NumberList";
parameter.SqlDbType = SqlDbType.Structured;
parameter.Value = numberList;
dataAdapter.Fill(dataTable);
}
return dataTable;
}
我使用此方法创建 table 值参数。
private DataTable AddClientIdsToNumberListTemporaryTable(List<int> clientIds)
{
var dataTable = new DataTable("NumberList");
dataTable.Columns.Add("value", typeof(int));
for (int i = 0; i < clientIds.Count; i++)
{
dataTable.Rows.Add(clientIds[i]);
}
return dataTable;
}
您是否尝试过将类型名称添加到参数中?我很惊讶没有它它还能工作。
parameter.TypeName = "NumberList";
您需要将您创建的参数添加到命令中。
using (var dataAdapter = new SqlDataAdapter(command))
{
var parameter = new SqlParameter();
parameter.ParameterName = "@NumberList";
parameter.SqlDbType = SqlDbType.Structured;
parameter.Value = numberList;
//ADD THIS
command.Parameters.Add(parameter);
dataAdapter.Fill(dataTable);
}
我有一个接受 table 值参数的存储过程。当我在 SQL Server Management Studio 2014 中使用 table 值参数测试过程时,我得到了正确的返回值。
declare @NumberList as dbo.NumberList
insert into @NumberList(value) values (16101197);
insert into @NumberList(value) values (16101196);
insert into @NumberList(value) values (16101194);
insert into @NumberList(value) values (16101042);
insert into @NumberList(value) values (16101190);
insert into @NumberList(value) values (16101191);
--select value from @NumberList
exec GetClientLeadsByClientId @NumberList
但是,在我的 C# 代码中 DataTable
是空的。当我在 SQL Server Management Studio 中测试时,clientIds
与上面的值匹配。
private DataTable GetClientLeadsByClientIds(List<int> clientIds)
{
var dataTable = new DataTable();
var numberList = AddClientIdsToNumberListTemporaryTable(clientIds);
var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
using (var command = new SqlCommand("GetClientLeadsByClientId", connection) { CommandType = CommandType.StoredProcedure } )
using (var dataAdapter = new SqlDataAdapter(command))
{
var parameter = new SqlParameter();
parameter.ParameterName = "@NumberList";
parameter.SqlDbType = SqlDbType.Structured;
parameter.Value = numberList;
dataAdapter.Fill(dataTable);
}
return dataTable;
}
我使用此方法创建 table 值参数。
private DataTable AddClientIdsToNumberListTemporaryTable(List<int> clientIds)
{
var dataTable = new DataTable("NumberList");
dataTable.Columns.Add("value", typeof(int));
for (int i = 0; i < clientIds.Count; i++)
{
dataTable.Rows.Add(clientIds[i]);
}
return dataTable;
}
您是否尝试过将类型名称添加到参数中?我很惊讶没有它它还能工作。
parameter.TypeName = "NumberList";
您需要将您创建的参数添加到命令中。
using (var dataAdapter = new SqlDataAdapter(command))
{
var parameter = new SqlParameter();
parameter.ParameterName = "@NumberList";
parameter.SqlDbType = SqlDbType.Structured;
parameter.Value = numberList;
//ADD THIS
command.Parameters.Add(parameter);
dataAdapter.Fill(dataTable);
}