"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)