c# - foreach 循环确实循环,然后出现错误 过程或函数 spTestSp 指定了太多参数

标签 c# foreach sqlconnection

我无法弄清楚我在这个 foreach 循环中做错了什么,它插入第一组记录,然后返回错误;过程或函数 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 block 中重用它有任何优势。由于您可以清除它的参数,因此可以更轻松地重新创建整个命令,如下所示:

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 block 会自动将其关闭,因此您无需手动进行关闭。

至于您的错误,它的发生仅仅是因为在一个循环周期后您的命令中的参数太多。

关于c# - foreach 循环确实循环,然后出现错误 过程或函数 spTestSp 指定了太多参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28173423/

相关文章:

c# - 预定义类型 System.Range 未定义或导入

c# - DataGridView.Datasource = null;错误: Object reference not set to an instance of an object

c# - 如何在 .NET 中重用套接字?

Java for each 与常规 for - 它们是否等效?

c# - ASP.NET使用SqlConnection连接MySQL

c# - 只读数据库上的索引

mysql - 如何循环遍历特定的列名并清除 PHP/MySQL 中的这些字段?

for-loop - 在 Go 中并发访问具有 'range' 的 map

c# - MVC 中不支持关键字 : '"data source'.

c# - 为什么我们需要在 ConnectionString 中设置最小池大小