WCF - 用于将记录插入数据库的Foreach循环

时间:2018-01-08 15:56:27

标签: c# wcf stored-procedures

我正在研究WCF项目。我试图从一个数组插入多个记录到我的SQL Server数据库。

在调用服务时,我得到一个异常:“过程或函数指定了太多的参数”,而我函数中的参数与我的存储过程中声明的参数一致:

这是我在WCF中的功能:

    public static string SetGaranties( List<int> CODE_GARANTIES,  string NUMERO_POLICE, string CODE_BRANCHE, int CODE_SOUS_BRANCHE)
    {
        string MSG_ACQUITEMENT = string.Empty;
        DbCommand com = GenericData.CreateCommand(GenericData.carte_CarteVie_dbProviderName, GenericData.Carte_CarteVie_dbConnectionString);

        com.CommandText = "SetGaranties";

        com.Parameters.Clear();

        foreach (int CODE_GARANTIE in CODE_GARANTIES)
        {
            com.Connection.Open();
            SqlParameter NUMERO_POLICE_Param = new SqlParameter("@NUMERO_POLICE", NUMERO_POLICE);
            com.Parameters.Add(NUMERO_POLICE_Param);

            SqlParameter CODE_BRANCHE_Param = new SqlParameter("@CODE_BRANCHE", CODE_BRANCHE);
            com.Parameters.Add(CODE_BRANCHE_Param);

            SqlParameter CODE_SOUS_BRANCHE_Param = new SqlParameter("@CODE_SOUS_BRANCHE", CODE_SOUS_BRANCHE);
            com.Parameters.Add(CODE_SOUS_BRANCHE_Param);

            SqlParameter CODE_POSTALE_Param = new SqlParameter("@CODE_GARANTIE", CODE_GARANTIE);
            com.Parameters.Add(CODE_POSTALE_Param);
            DbDataReader reader = com.ExecuteReader();
            com.Connection.Close();                     

        }

这是我的存储过程:

    ALTER PROCEDURE [dbo].[SetGaranties]    
@NUMERO_POLICE     varchar(12),
@CODE_BRANCHE   varchar(1),
@CODE_SOUS_BRANCHE  int,
@CODE_GARANTIE  int
AS  
BEGIN  
   SET NOCOUNT ON;
    INSERT INTO dbo.MVT_GARANTIES VALUES(
@NUMERO_POLICE,
@CODE_BRANCHE,
@CODE_SOUS_BRANCHE,
@CODE_GARANTIE
);
END

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

在循环外部构建参数只需一次,在循环外部设置不变值,在循环内部只设置每个循环中更改的一个值

public static string SetGaranties( List<int> CODE_GARANTIES,  string NUMERO_POLICE, string CODE_BRANCHE, int CODE_SOUS_BRANCHE)
{
    string MSG_ACQUITEMENT = string.Empty;
    DbCommand com = GenericData.CreateCommand(GenericData.carte_CarteVie_dbProviderName, GenericData.Carte_CarteVie_dbConnectionString);
    com.CommandText = "SetGaranties";
    com.CommandType = CommandType.StoredProcedure;

    // These parameter's values don't change, set it once
    com.Parameters.Add("@NUMERO_POLICE", SqlDbType.VarChar).Value = NUMERO_POLICE;
    com.Parameters.Add("@CODE_BRANCHE",SqlDbType.VarChar).Value = CODE_BRANCHE;
    com.Parameters.Add("@CODE_SOUS_BRANCHE", SqlDbType.Int).Value = CODE_SOUS_BRANCHE;

    // This parameter's value changes inside the loop
    com.Parameters.Add("@CODE_GARANTIE",SqlDbType.Int);

    com.Connection.Open();
    foreach (int CODE_GARANTIE in CODE_GARANTIES)
    {
        com.Parameters["@CODE_GARANTIE"].Value = CODE_GARANTIE;
        com.ExecuteNonQuery();
    }
    com.Connection.Close();                     
}

其他要说的话:

  • 您使用的是全局连接对象,这通常非常糟糕 理念。 ADO.NET实现连接池,这意味着你 应该在需要时创建连接并销毁它 之后。
  • INSERT / UPDATE / DELETE记录时应使用ExecuteNonQuery。 当你没有任何内容时,无需构建SqlDataReader 回读。
  • 仅当您将CommandType设置为时,才会执行存储过程 StoredProcedure否则会出现语法错误,因为 CommandText不是有效的Sql语句

答案 1 :(得分:0)

此:

com.Parameters.Clear();

应该在你的循环中。使用当前代码,第一次迭代应具有正确数量的参数。但后续迭代将有太多,因为param列表没有被清除。