例外が発生し続ける
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();
}
}
どこが悪いのか教えてください。
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);
同じ問題が発生しましたが、試行されていたのと同様に、私はSqlParametersとしてobject [2] = object [1]を実行していました。
スレッドに追加するために、次のようなメソッドからSqlParametersのこの単純なオブジェクト配列を追加しました。
private SqlParameter GetGenericParamsObject(string name, object data)
{
return new SqlParameter(name, SetSqlDataType(data.GetType().ToString())) { Direction = Input, Value = data };
}
SetSqlDataType()の単純なスイッチがある場合、つまりSqlDbType.Intは、それを設定するための戻り値の型の1つです。
それから私は走ります
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;
}
}
これは、適切なデータ型にキャストするのに役立ち、デバッグを容易にするためにパラメータ名、データ型、およびオブジェクトをコマンドメソッドから移動してから、SqlParameter全体をcmd.Parametersに追加するだけです。
この質問の将来の読者のために-例は.Add()
を扱いますが、正しく使用されない場合、.Remove()
もこのエラーをスローします。他の人によって文書化されているように、.Add()
を使用する適切な方法は次のとおりです。
_cmd.Parameters.AddWithValue("Key", "Value");
_
.Remove()
を使用する適切な方法は次のとおりです。
_cmd.Parameters.Remove(command.Parameters["Key"]);
_