SqlParameter Value还是SqlValue?

7

我收到了以下错误:

SqlParameterCollection 只接受非空的 SqlParameter 类型对象,而不是 String 对象

这是代码:

.Parameters.Add(new SqlParameter("@username", SqlDbType.NVarChar,128).Value = username);

如果我更改为:
.Parameters.Add(new SqlParameter("@username", SqlDbType.NVarChar,128).SqlValue = username);

只关注工作本身不就好了吗?

sqlValue 不是数据库类型吗?

这是我使用的 DAL:

public class DBAccess : IDisposable
{

    private IDbCommand cmd = new SqlCommand();
    private string strConnectionString = "";
    private bool handleErrors = false;
    private string strLastError = "";

    public DBAccess()
    {
        strConnectionString = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;
        SqlConnection cnn = new SqlConnection();
        cnn.ConnectionString = strConnectionString;
        cmd.Connection = cnn;
        cmd.CommandType = CommandType.StoredProcedure;
    }


    public CommandType CommandType
    {
        get
        {
            return cmd.CommandType;
        }
        set
        {
            cmd.CommandType = value;
        }
    }

    public IDataReader ExecuteReader()
    {
        IDataReader reader = null;
        try
        {
            if (cmd.Connection.State == ConnectionState.Closed)
            {
                this.Open();
            }
            reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        catch (Exception ex)
        {
            if (handleErrors)
                strLastError = ex.Message;
            else
                throw;
        }
        return reader;
    }

    public IDataReader ExecuteReader(string commandtext)
    {
        IDataReader reader = null;
        try
        {
            cmd.CommandText = commandtext;
            reader = this.ExecuteReader();
        }
        catch (Exception ex)
        {
            if (handleErrors)
                strLastError = ex.Message;
            else
                throw;
        }

        return reader;
    }

    public object ExecuteScalar()
    {
        object obj = null;
        try
        {
            if (cmd.Connection.State == ConnectionState.Closed)
            {
                this.Open();
            }
            obj = cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            if (handleErrors)
                strLastError = ex.Message;
            else
                throw;
        }

        return obj;
    }

    public object ExecuteScalar(string commandtext)
    {
        object obj = null;
        try
        {
            cmd.CommandText = commandtext;
            obj = this.ExecuteScalar();
        }
        catch (Exception ex)
        {
            if (handleErrors)
                strLastError = ex.Message;
            else
                throw;
        }

        return obj;
    }

    public int ExecuteNonQuery()
    {
        int i = -1;
        try
        {
            if (cmd.Connection.State == ConnectionState.Closed)
            {
                this.Open();
            }
            i = cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            if (handleErrors)
                strLastError = ex.Message;
            else
                throw;
        }

        return i;
    }


    public int ExecuteNonQuery(string commandtext)
    {
        int i = -1;
        try
        {
            cmd.CommandText = commandtext;
            i = this.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            if (handleErrors)
                strLastError = ex.Message;
            else
                throw;
        }

        return i;
    }


    public DataSet ExecuteDataSet()
    {
        SqlDataAdapter da = null;
        DataSet ds = null;
        try
        {
            if (cmd.Connection.State == ConnectionState.Closed)
            {
                this.Open();
            }
            da = new SqlDataAdapter();
            da.SelectCommand = (SqlCommand)cmd;
            ds = new DataSet();
            da.Fill(ds);
        }
        catch (Exception ex)
        {
            if (handleErrors)
                strLastError = ex.Message;
            else
                throw;
        }

        return ds;
    }


    public DataSet ExecuteDataSet(string commandtext)
    {
        DataSet ds = null;
        try
        {
            cmd.CommandText = commandtext;
            ds = this.ExecuteDataSet();
        }
        catch (Exception ex)
        {
            if (handleErrors)
                strLastError = ex.Message;
            else
                throw;
        }

        return ds;
    }

    public int CommandTimeout
    {
        get
        {
            return cmd.CommandTimeout;
        }
        set
        {
            cmd.CommandTimeout = value;
        }
    }

    public IDbConnection Connection
    {
        get
        {
            return cmd.Connection;
        }
        set
        {
            cmd.Connection = value;
        }
    }

    public string CommandText
    {
        get
        {
            return cmd.CommandText;
        }
        set
        {
            cmd.CommandText = value;
            cmd.Parameters.Clear();
        }
    }

    public IDataParameterCollection Parameters
    {
        get
        {
            return cmd.Parameters;
        }
    }

    public IDbTransaction Transaction
    {
        get
        {
            return cmd.Transaction;
        }
        set
        {
            cmd.Transaction = value;
        }
    }

    public void AddParameter(string paramname, object paramvalue)
    {
        var param = new SqlParameter(paramname, paramvalue);
        cmd.Parameters.Add(param);
    }

    public void AddParameter(IDataParameter param)
    {
        cmd.Parameters.Add(param);
    }


    public IDbTransaction BeginTransaction()
    {
        var tran = cmd.Connection.BeginTransaction();
        cmd.Transaction = tran;
        return tran;
    }

    public void CommitTransaction()
    {
        cmd.Transaction.Commit();
    }

    public void RollbackTransaction()
    {
        cmd.Transaction.Rollback();
    }

    public System.Data.ConnectionState State
    {
        get
        {
            return cmd.Connection.State;
        }
    }

    public string ConnectionString
    {
        get
        {
            return strConnectionString;
        }
        set
        {
            strConnectionString = value;
        }
    }

    private void Open()
    {
        cmd.Connection.Open();
    }

    public bool HandleExceptions
    {
        get
        {
            return handleErrors;
        }
        set
        {
            handleErrors = value;
        }
    }

    public string LastError
    {
        get
        {
            return strLastError;
        }
    }

    public void Dispose()
    {
        cmd.Connection.Close();
        cmd.Connection.Dispose();
        cmd.Dispose();
    }
}

这无法构建,因为当放置在SqlParameter之外时,Value不是一个属性。 - Addeladde
2
你先试了吗?那应该可以工作。在发表评论之前,请先尝试一下。如果您已经尝试过,请发布编译器错误信息。 - Sriram Sakthivel
我尝试了一下,编译器报错: 错误28:'int'不包含名称为'Value'的定义,并且没有接受类型为'int'的第一个参数的扩展方法'Value'可以找到(您是否缺少使用指令或程序集引用?) - Addeladde
我们不了解你的抽象层。如果你直接使用 SqlCommand,你可以这样做:command.Parameters.Add(new SqlParameter("@username", SqlDbType.NVarChar, 128)).Value = username;。基于此,我相信你可以更新你的代码。 - Sriram Sakthivel
我添加了DBAccess类,这是我使用的类。 - Addeladde
显示剩余3条评论
4个回答

9

这似乎解决了问题。

.Parameters.Add(new SqlParameter("@username", SqlDbType.NVarChar, 128) { Value = username });

1
实际上,即使您的第二行代码也不起作用,因为

new SqlParameter("@username", SqlDbType.NVarChar,128).Value = username

new SqlParameter("@username", SqlDbType.NVarChar,128).SqlValue = username

都是表达式,它们评估为字符串对象,而错误提示SqlParameterCollection不接受字符串对象。

一个更简洁的添加带有值参数的方法是这样的:

.Parameters.Add("@username", SqlDbType.NVarChar, 128).Value = username;

这是可能的,因为Add返回一个SqlParameter对象,所以您可以在同一行上设置其Value属性。

该代码编译错误: 方法“Add”的重载不接受3个参数。 - Addeladde
1
@Addeladde 当然会的 请参考 - Saeb Amini

0

相同的错误。 这个有效,但是我想指定长度和数据类型,以便我不会得到很多查询计划。 db.Parameters.Add(new SqlParameter("@username", username)); - Addeladde
修改了之前的帖子。 - Kenneth Bautista
谢谢,这个可以用,但是把它放在一行上会更好。 - Addeladde
.Parameters.Add("@username", SqlDbType.NVarChar, 128).Value = username; - Kenneth Bautista
Kenneth出现编译错误:方法“Add”的重载不接受3个参数。 - Addeladde
那我应该使用什么? - Addeladde

0
尝试使用AddWithValue
command.Parameters.AddWithValue("@username", username);

这个可以用,但是会给我每个用户名长度的查询计划。 - Addeladde
你不能在代码部分内进行必要的控制吗?我认为在将数据发送到数据库之前进行控制更加合理。 - İsmet Alkan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接