Как создать SqlParameterCollection с несколькими параметрами?

Я пытаюсь создать SqlParameterCollection, но дает ошибку при добавлении некоторого метода SqlParameter в sp.Add().

Пожалуйста, помогите мне, как добавить параметр и как передать его моей другой функции, где я объявляю SqlConnection и SqlCommand.

SqlParameterCollection sp = null;                    
sp.Add(new SqlParameter("@CmpyCode", SqlDbType.NVarChar)).Value = CV.Global.CMPYCODE;
sp.Add(new SqlParameter("@Code", SqlDbType.NVarChar)).Value = codeName;
sp.Add(new SqlParameter("@DisplayCode", SqlDbType.NVarChar)).Value = codeName + "-";
sp.Add(new SqlParameter("@TotalDigit", SqlDbType.Int)).Value = CV.Global.PARAMTOTALDIGIT;
insertData("<Sp Name>", sp);

Моя другая функция - insertData (...)

internal static int insertData(string spName, SqlParameterCollection sp)
{
        int retObj = 0;

        using (SqlConnection con = new SqlConnection(CV.Global.CONSTRING))
        {
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand(spName, con);
                cmd.CommandType = CommandType.StoredProcedure;

                if (sp.Count > 0)
                {
                    foreach (SqlParameter param in sp)
                        cmd.Parameters.Add(param);
                }

                retObj = cmd.ExecuteNonQuery();
            }
            catch (Exception ev) 
            { 
                Util.Log(ev); 
                throw; 
            }
            finally
            {
                try
                {
                    con.Close();
                }
                catch (Exception ev) { Util.Log(ev); throw; }
            }
        }
        return retObj;
    }

Я пытаюсь создать SqlParameterCollection и передал его функции insertData. Но это вызывает ошибку, когда я вызываю метод sp.Add() в моей первой функции.

Ошибка

Ссылка на объект не установлена ​​в экземпляр объекта

Ответ 1

Вы не можете использовать любую переменную типа SqlParameterCollection (ссылочный объект) без вызова своего конструктора (new), но SqlParameterCollection - это объект, который нельзя инициализировать напрямую с помощью нового. Он не имеет конструктора по умолчанию и может быть извлечен только из существующего SqlCommand.

 SqlCommand cmd = new SqlCommand(commandText, connection);
 SqlParameterCollection sp = cmd.Parameters;

Я предлагаю изменить ваш метод InsertData, чтобы принять List<SqlParameter> и позволить ему обрабатывать добавление параметров в SqlCommand, который выполняет текст команды

List<SqlParameter> sp = new List<SqlParameter>()
{
    new SqlParameter() {ParameterName = "@CmpyCode", SqlDbType = SqlDbType.NVarChar, Value= CV.Global.CMPYCODE},
    new SqlParameter() {ParameterName = "@Code", SqlDbType = SqlDbType.NVarChar, Value = codeName},
    new SqlParameter() {ParameterName = "@DisplayCode", SqlDbType = SqlDbType.NVarChar, Value = codeName + "-"},
    new SqlParameter() {ParameterName = "@TotalDigit", SqlDbType = SqlDbType.Int, Value = CV.Global.PARAMTOTALDIGIT}
};
insertData(CV.Sps.SP_INSERT_PARAM_TABLE, sp);

и InsertData просто получает необязательный список SqlParameter и при необходимости добавляет их во внутреннюю коллекцию параметров SqlCommand

internal static int insertData(string spName, List<SqlParameter> sp = null)
{
    ....
    if(sp != null)
        cmd.Parameters.AddRange(sp.ToArray());
    ....
}