"SqlParameterCollection只接受非null的SqlParameter类型对象,而不接受String对象"

Ruc*_*rma 9 .net c# database sql-server

我一直得到例外

The SqlParameterCollection only accepts non-null SqlParameter type objects, not String objects
Run Code Online (Sandbox Code Playgroud)

,执行以下代码时:

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();
                    }
                }
Run Code Online (Sandbox Code Playgroud)

请告诉我我哪里出错了.

Dah*_*Sra 43

我尝试了上述所有步骤,但没有任何帮助。

最后通过更改命名空间找到并修复它

使用 System.Data.SqlClient使用 Microsoft.Data.SqlClient

阿尔沙德

  • 我认为 System.Data.SqlClient 正在[退休](https://devblogs.microsoft.com/dotnet/introducing-the-new-microsoftdatasqlclient/)。 (4认同)

Kir*_*eed 13

我用 Microsoft.Data.SqlClient 替换了我对 System.Data.SqlClient 的引用,更正了 using 语句,我的问题就消失了

在我的 .csproj 我现在有

  <ItemGroup>
    <PackageReference Include="Microsoft.Data.SqlClient" Version="1.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.3" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.3" />
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

但我也发现我使用了以下场景,我创建了一个 System.Data.SqlClient.SqlParameter

    public static List<T> RunQuery<T>(ApiDbContext context, string query, Func<DbDataReader, T> map, params SqlParameter[] parameters)
    {
        var cn = context.Database.GetDbConnection();
        var oldState = cn.State;
        if (cn.State.Equals(ConnectionState.Closed)) { cn.Open(); }

        using (var command = cn.CreateCommand())
        {
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            foreach (var param in parameters)
            {
                var p = new System.Data.SqlClient.SqlParameter
                {
                    ParameterName = param.ParameterName, Value = param.Value, SqlDbType = param.SqlDbType
                };
                command.Parameters.Add(p);
            }
            if (cn.State.Equals(ConnectionState.Closed)) { cn.Open(); }
            var entities = new List<T>();
            using (var result = command.ExecuteReader())
            {
                while (result.Read())
                {
                    entities.Add(map(result));
                }
            }

            if (oldState.Equals(ConnectionState.Closed) && cn.State == ConnectionState.Open) { cn.Close(); }
            return entities;
        }
    }
Run Code Online (Sandbox Code Playgroud)


Jon*_*ell 7

我得到了同样的错误,不得不AddWithValue像这样使用......

cmd.Parameters.AddWithValue(@columnToUpdate, newValue);
cmd.Parameters.AddWithValue(@conditionalColumn, conditionalValue);
Run Code Online (Sandbox Code Playgroud)


shr*_*t18 5

当您使用Add方法时,您正在尝试添加一个新参数。你要做的是赋值。所以改变这个:

comm.Parameters.Add(dataGridView1.Rows[i].Cells[0].Value.ToString());
Run Code Online (Sandbox Code Playgroud)

对此:

comm.Parameters["@author"].Value = dataGridView1.Rows[i].Cells[0].Value.ToString();
Run Code Online (Sandbox Code Playgroud)

其他参数类似。