"SqlParameterCollection принимает только ненулевые объекты типа SqlParameter, а не строковые объекты"

Я продолжаю получать исключение

The SqlParameterCollection only accepts non-null SqlParameter type objects, not String objects

, при выполнении следующего кода:

string StrQuery;
            using (SqlConnection conn = new SqlConnection(@"Data Source=.sqlexpress;Initial Catalog=SanFransiscoData;Integrated Security=True;Pooling=False"))
            {
                using (SqlCommand comm = new SqlCommand())
                {
                    comm.Connection = conn;
                    conn.Open();
                   // SqlParameter author = new SqlParameter("@author", dataGridView1.Rows[0].Cells[0].Value.ToString());
                    comm.Parameters.Add("@author", SqlDbType.VarChar);
                    comm.Parameters.Add("@title", SqlDbType.NVarChar);
                    comm.Parameters.Add("@genre", SqlDbType.VarChar);
                    comm.Parameters.Add("@price", SqlDbType.Float);
                    comm.Parameters.Add("@publish_date", SqlDbType.Date);
                    comm.Parameters.Add("@description", SqlDbType.NVarChar);
                    comm.Parameters.Add("@bookid", SqlDbType.VarChar);
                    for (int i = 0; i < dataGridView1.Rows.Count; i++)
                    {
                        StrQuery = "INSERT INTO BooksData VALUES(@author,@title,@genre,@price,@publish_date,@description,@bookid)";
                        comm.Parameters.Add(dataGridView1.Rows[i].Cells[0].Value.ToString());
                        comm.Parameters.Add(dataGridView1.Rows[i].Cells[1].Value.ToString());
                        comm.Parameters.Add(dataGridView1.Rows[i].Cells[2].Value.ToString());
                        comm.Parameters.Add(Convert.ToDecimal(dataGridView1.Rows[i].Cells[3].Value));
                        comm.Parameters.Add(Convert.ToDateTime(dataGridView1.Rows[i].Cells[4].Value));
                        comm.Parameters.Add(dataGridView1.Rows[i].Cells[5].Value.ToString());
                        comm.Parameters.Add(dataGridView1.Rows[i].Cells[6].Value.ToString());
                        comm.CommandText = StrQuery;
                        comm.ExecuteNonQuery();
                    }
                }

Пожалуйста, скажите мне, где я ошибаюсь.

4 ответов


при использовании Add метод, который вы пытаетесь добавить новый параметр. Что вы хотите сделать, это присвоить значение. Поэтому измените это:

comm.Parameters.Add(dataGridView1.Rows[i].Cells[0].Value.ToString());

для этого:

comm.Parameters["@author"].Value = dataGridView1.Rows[i].Cells[0].Value.ToString();

аналогично для других параметров.


Я получал ту же ошибку и должен был использовать AddWithValue такой...

cmd.Parameters.AddWithValue(@columnToUpdate, newValue);
cmd.Parameters.AddWithValue(@conditionalColumn, conditionalValue);

я столкнулся с той же проблемой, но мой делал объект[2] = object[1] Как SqlParameters, подобный тому, что пробовали.

чтобы добавить в поток, у меня есть этот простой массив объектов SqlParameters, добавленный из такого метода,

    private SqlParameter GetGenericParamsObject(string name, object data)
    {
        return new SqlParameter(name, SetSqlDataType(data.GetType().ToString())) { Direction = Input, Value = data };
    }

где есть простой переключатель для SetSqlDataType (), т. е. SqlDbType.Int является одним из возвращаемых типов для его установки.

тогда я бегу

    private static void ExecuteSqlCommand(DbContext dbContext, string sql, params object[] sqlParameters)
    {
        try
        {
            if (dbContext.Database.Connection.State == ConnectionState.Closed)
                dbContext.Database.Connection.Open();
            var cmd = dbContext.Database.Connection.CreateCommand();
            cmd.CommandText = sql;
            foreach (var param in sqlParameters)
                cmd.Parameters.Add(param);
            cmd.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }

Это помогает с приведением к правильным данным введите и переместите имя param, тип данных и объект из командного метода для упрощения отладки, а затем просто добавьте весь SqlParameter в cmd.Параметры.


я столкнулся с той же ошибкой, когда использовал

cmd.Parameters.Add(pars)

где pars был массивом SqlParameter. Проблема заключалась в том, что я использовал функцию "Add", но вместо этого я должен был использовать "AddRange".

cmd.Parameters.AddRange(pars)