foreach 循环执行循环,然后出现错误过程或函数 spTestSp 指定的参数太多
foreach loop does loop, then get error Procedure or function spTestSp has too many arguments specified
我无法弄清楚我在这个 foreach 循环中做错了什么,它插入第一组记录,然后 return 错误;过程或函数 spTestSp 指定的参数太多。
谁能给我指出正确的方向
List<Jobs> jobDetails = new List<Jobs>
{
new Jobs {JobDate = "Job3",JobRrf = "ref3"},
new Jobs {JobDate = "Job4",JobRrf = "REf4"},
new Jobs {JobDate = "Job5",JobRrf = "ref5"},
new Jobs {JobDate = "Job6",JobRrf = "REf6"},
};
const string spName = "dbo.spTestSp";
using (var cn = new SqlConnection(_dbConn))
{
using (var cmd = new SqlCommand(spName, cn))
{
//cn.Open();
foreach (var data in jobDetails)
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", data.JobDate);
cmd.Parameters.AddWithValue("@param2", data.JobRrf);
//cmd.Parameters.AddWithValue("@param2", data.JobRrf);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
//cn.Close();
}
}
alter PROCEDURE spTestSp
-- Add the parameters for the stored procedure here
@param1 nvarchar(50),
@param2 nvarchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
insert into [dbo].[tblTest]([test1],[test2])values(@param1,@param2)
END
就我个人而言,我看不出只创建一个 SqlCommand
对象并在 foreach
块中重用它有什么好处。由于您可以清除它的参数,因此重新创建整个命令会更容易,如下所示:
cn.Open();
foreach (var data in jobDetails)
{
using (var cmd = new SqlCommand(spName, cn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", data.JobDate);
cmd.Parameters.AddWithValue("@param2", data.JobRrf);
//cmd.Parameters.AddWithValue("@param2", data.JobRrf);
cmd.ExecuteNonQuery();
}
}
//cn.Close();
在您的代码中,您向服务器发出信号以关闭连接并将其在每个命令后移至连接池,这不是很有效。打开它一次并将您的数据发送到服务器。另请注意,SqlConnection
对象的 using
块将自动关闭它,因此您不必手动关闭它。
至于你的错误,只是因为你在一个循环后命令中的参数太多了。
我无法弄清楚我在这个 foreach 循环中做错了什么,它插入第一组记录,然后 return 错误;过程或函数 spTestSp 指定的参数太多。
谁能给我指出正确的方向
List<Jobs> jobDetails = new List<Jobs>
{
new Jobs {JobDate = "Job3",JobRrf = "ref3"},
new Jobs {JobDate = "Job4",JobRrf = "REf4"},
new Jobs {JobDate = "Job5",JobRrf = "ref5"},
new Jobs {JobDate = "Job6",JobRrf = "REf6"},
};
const string spName = "dbo.spTestSp";
using (var cn = new SqlConnection(_dbConn))
{
using (var cmd = new SqlCommand(spName, cn))
{
//cn.Open();
foreach (var data in jobDetails)
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", data.JobDate);
cmd.Parameters.AddWithValue("@param2", data.JobRrf);
//cmd.Parameters.AddWithValue("@param2", data.JobRrf);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
//cn.Close();
}
}
alter PROCEDURE spTestSp
-- Add the parameters for the stored procedure here
@param1 nvarchar(50),
@param2 nvarchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
insert into [dbo].[tblTest]([test1],[test2])values(@param1,@param2)
END
就我个人而言,我看不出只创建一个 SqlCommand
对象并在 foreach
块中重用它有什么好处。由于您可以清除它的参数,因此重新创建整个命令会更容易,如下所示:
cn.Open();
foreach (var data in jobDetails)
{
using (var cmd = new SqlCommand(spName, cn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", data.JobDate);
cmd.Parameters.AddWithValue("@param2", data.JobRrf);
//cmd.Parameters.AddWithValue("@param2", data.JobRrf);
cmd.ExecuteNonQuery();
}
}
//cn.Close();
在您的代码中,您向服务器发出信号以关闭连接并将其在每个命令后移至连接池,这不是很有效。打开它一次并将您的数据发送到服务器。另请注意,SqlConnection
对象的 using
块将自动关闭它,因此您不必手动关闭它。
至于你的错误,只是因为你在一个循环后命令中的参数太多了。