wizklaus Ответов: 2

Как добавить новый параметр в коллекцию sqlparameter [ ]?


Как добавить новый параметр

new SqlParameter("@LastName", app.LastName??"")

на аргумент @params в Если условие.



SqlParameter[] @params = {
SqlParameter("@AppId", app.AppId),
									new SqlParameter("@FirstName", app.FirstName??""),
										new SqlParameter("@MiddleName", app.MiddleName ?? ""),
										new SqlParameter("@Gender", app.Gender??""),
};
@params[0].Direction = ParameterDirection.Output;
if (app.AppId == 1)
				{
					SqlHelper.ExecuteNonQuery(cn, CommandType.StoredProcedure, "Create_Kiosk", @params);
				}
				else
				{
					SqlHelper.ExecuteNonQuery(cn, CommandType.StoredProcedure, "Create", @params);
				}


Что я уже пробовал:

@params[0].Direction = ParameterDirection.Output;
if (app.AppId == 1)
				{
@params.Concat(new SqlParameter("@LastName", app.LastName??""));
					SqlHelper.ExecuteNonQuery(cn, CommandType.StoredProcedure, "Create_Kiosk", @params);
				}
				else
				{
					SqlHelper.ExecuteNonQuery(cn, CommandType.StoredProcedure, "Create", @params);
				}

2 Ответов

Рейтинг:
8

Richard Deeming

Массив-это структура данных фиксированного размера. Вы не можете добавить в него элементы, не создав новый массив. Замечания по поводу то Array.Resize метод[^] объяснять:

Цитата:
Этот метод выделяет новый массив с заданным размером, копирует элементы из старого массива в новый, а затем заменяет старый массив новым.

Лучшим вариантом было бы использовать List<T> чтобы сохранить ваши параметры. Если вызываемый метод принимает только массив, то вы можете вызвать списки есть ToArray метод[^] чтобы получить один.
string procedureName;

var @params = new List<SqlParameter>
{
    new SqlParameter("@AppId", app.AppId) { Direction = ParameterDirection.Output },
    new SqlParameter("@FirstName", app.FirstName ?? ""),
    new SqlParameter("@MiddleName", app.MiddleName ?? ""),
    new SqlParameter("@Gender", app.Gender ?? ""),
};

if (app.AppId == 1)
{
    procedureName = "Create_Kiosk";
    @params.Add(new SqlParameter("@LastName", app.LastName ?? ""));
}
else
{
    procedureName = "Create";
}

SqlHelper.ExecuteNonQuery(cn, CommandType.StoredProcedure, procedureName, @params.ToArray());


Рейтинг:
1

Ziee-M

SqlParameter[] @params;


if (app.AppId == 1)
				{
@params = {
SqlParameter("@AppId", app.AppId),									new SqlParameter("@FirstName", app.FirstName??""),										new SqlParameter("@MiddleName", app.MiddleName ?? ""),										new SqlParameter("@Gender", app.Gender??"")}; //add other params

@params[0].Direction = ParameterDirection.Output;

SqlHelper.ExecuteNonQuery(cn, CommandType.StoredProcedure, "Create_Kiosk", @params);
				}
				else
				{
@params = {
SqlParameter("@AppId", app.AppId),									new SqlParameter("@FirstName", app.FirstName??""),										new SqlParameter("@MiddleName", app.MiddleName ?? ""),										new SqlParameter("@Gender", app.Gender??"")}; //add other params

@params[0].Direction = ParameterDirection.Output;

					SqlHelper.ExecuteNonQuery(cn, CommandType.StoredProcedure, "Create", @params);
				}


wizklaus

Спасибо @Ziee-M. Но это не то решение, которое я могу принять, так как у меня есть более 50 параметров в исходном коде. Я читал другой пример, где использовался список. но разве это не может быть архив с массивом? добавление нового параметра в коллекцию sqlparameter [].

Eric Lynch

Возможно, вы захотите взглянуть на коллекцию SqlParameterCollection.Метод AddRange(SqlParameter []), описанный здесь: https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparametercollection

Ziee-M

Создание нескольких SqlParameters не имеет смысла для меня, потому что таблица всегда имеет одинаковое количество параметров.
В принципе, вы должны иметь уникальный анализатор параметров для всех ваших методов CRUD и повторно использовать его.
В случае, если параметр неприменим, вы должны установить значение по умолчанию для этого конкретного параметра или просто игнорировать его(вы должны установить это поле nullable на уровне базы данных)