繁体   English   中英

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

[英]WCF - Foreach loop to insert records into a database

我正在从事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

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

只需在循环外构建一次参数,在循环外设置不变值,在循环内只需设置一个在每次循环时都会改变的值

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语句

这个:

com.Parameters.Clear();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM