Как добавить число в Sqlcommand.Parameters? - PullRequest
1 голос
/ 31 августа 2009

Вот мой метод:

public void EjecutarGuardar(string ProcedimientoAlmacenado, object[] Parametros)
        {
            SqlConnection Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

            SqlCommand Command = Connection.CreateCommand();
            Command.CommandText = ProcedimientoAlmacenado;
            Command.CommandType = CommandType.StoredProcedure;
            foreach (object X in Parametros)
            {
                Command.Parameters.Add(X);
            }            

            Connection.Open();
            Command.ExecuteNonQuery();
            Connection.Close();

            Connection.Dispose();
        }

Скажем, я добавил int в свой массив объектов PARAMETROS, когда он достигает оператора foreach, я получаю ошибку:

Только SqlParameterCollection принимает ненулевой тип SqlParameter объекты, а не объекты Int32.

Итак, как я могу загрузить все свои параметры за пределы этого класса, а затем поместить их все в общий массив и передать его этому методу, чтобы сделать его волшебным. Любая помощь?

Редактировать: друг прислал мне этот код, он будет работать? Я не могу понять, что он делает. : S

protected void CargarParametros(SqlCommand Com, System.Object[] Args)
        {                
            for (int i = 1; i < Com.Parameters.Count; i++)
            {
                SqlParameter P = (SqlParameter)Com.Parameters[i];
                if (i <= Args.Length )
                    P.Value = Args[i - 1];
                else
                    P.Value = null;
            }
        }

Ответы [ 5 ]

4 голосов
/ 31 августа 2009

Использовать метод AddWithValue,

string []para={"@eno","@ename","@edate"};
object []val={11,"A","1-1-2002"};

System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(@"");
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandText = "proc_name";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = cn;
for(int i=0;i<para.Length;i++){
  cmd.Parameters.AddWithValue(para[i], val[i]);
}

cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
1 голос
/ 31 августа 2009

Ваш SqlCommand завершает хранимую процедуру. Чтобы вызвать его, вам нужно будет создать экземпляр SqlParameter для каждого параметра, который вы передаете или извлекаете из хранимой процедуры. Вы не можете просто добавить свои значения - как ADO.NET узнает, какое значение назначить какому параметру ??

Каждый SqlParameter содержит такие вещи, как:

  • a имя
  • его тип данных
  • возможно ограничения (по размеру, длине)
  • и, возможно, значение

Итак, в вашем случае ваше заявление должно выглядеть примерно так:

SqlCommand Command = Connection.CreateCommand();
Command.CommandText = ProcedimientoAlmacenado;
Command.CommandType = CommandType.StoredProcedure;

foreach (object X in Parametros)
{
    SqlParameter param = new SqlParameter();
    param.ParameterName = Parametros.Name;
    // you need to find a way to determine what DATATYPE the
    // parameter will hold - Int, VarChar etc.
    param.SqlDbType = SqlDbType.Int;  
    param.Value = Parametros.Value;

    Command.Parameters.Add(param);
}           

Таким образом, простое добавление значений не сработает - вам нужно записать эти параметры с помощью их имени, типа данных, длины и т. Д. И их значений.

Марк

0 голосов
/ 31 августа 2009

Я не эксперт, но я думаю, вы должны назвать свои параметры; поэтому вместо того, чтобы иметь массив объектов, вы должны рассмотреть возможность создания массива пар ключ-значение.

Затем вы должны взглянуть на один из конструкторов SqlParameter: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.sqlparameter.aspx

0 голосов
/ 31 августа 2009

Вы также можете использовать сокращенную версию. ADO.NET узнает, что это число, и вставит правильный тип данных, если вы сделаете это:

Command.Parameters.Add(new SqlParameter("@YourParameterID", 4));

и т.д.

Кроме того, убедитесь, что вы не вставляете NULL в поле данных NOT NULL и неявно преобразуются в тип SqlParameter.

0 голосов
/ 31 августа 2009

Вам нужно сделать это:

Пример команды Sql:

"SELECT * FROM YourTable WHERE FirstColumn = @YourParameterID;"

Чтобы добавить параметр для этой команды:

Command.Parameters.Add(new SqlParameter("@YourParameterID", SqlDbType.Int).Value = X);
...