web-dev-qa-db-ja.com

「SqlParameterCollectionは、null以外のSqlParameterタイプのオブジェクトのみを受け入れ、Stringオブジェクトは受け入れません」

例外が発生し続ける

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();
                    }
                }

どこが悪いのか教えてください。

9
Ruchir Sharma

Addメソッドを使用する場合、新しいパラメーターを追加しようとしています。あなたがしたいのは、価値を割り当てることです。したがって、これを変更します。

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

これに:

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

他のパラメータについても同様です。

2
shree.pat18

同じエラーが発生し、このようにAddWithValueを使用する必要がありました...

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

同じ問題が発生しましたが、試行されていたのと同様に、私は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に追加するだけです。

1
Stephen Himes

この質問の将来の読者のために-例は.Add()を扱いますが、正しく使用されない場合、.Remove()もこのエラーをスローします。他の人によって文書化されているように、.Add()を使用する適切な方法は次のとおりです。

_cmd.Parameters.AddWithValue("Key", "Value");
_

.Remove()を使用する適切な方法は次のとおりです。

_cmd.Parameters.Remove(command.Parameters["Key"]); 
_
0
Jaken Herman