简体   繁体   English

SqlParameter 值还是 SqlValue?

[英]SqlParameter Value or SqlValue?

I get an error saying this:我收到一条错误消息:

SqlParameterCollection only accepts non-null SqlParameter type objects, not String objects SqlParameterCollection 只接受非空的 SqlParameter 类型对象,不接受 String 对象

On this code:在此代码上:

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

If I change this to:如果我将其更改为:

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

Shouldn't just value work?不应该只是价值工作吗?

is'nt sqlValue the database type? sqlValue 不是数据库类型吗?

Here is the DAL i use:这是我使用的 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();
    }
}

这似乎解决了问题。

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

Actually even your second line of code won't work, because both实际上,即使您的第二行代码也不起作用,因为两者

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

and

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

are expressions which evaluate to a string object, and as the error is telling you SqlParameterCollection does not accept string objects.是计算为字符串对象的表达式,并且错误告诉您SqlParameterCollection不接受字符串对象。

A neater way to add your parameters with values would be like this:一种用值添加参数的更简洁的方法是这样的:

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

This is possible because Add returns a SqlParameter object so you can set its Value property on the same line.这是可能的,因为Add返回一个 SqlParameter 对象,因此您可以在同一行上设置它的Value属性。

Try your code like this.像这样试试你的代码。

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

param.Value = username;

command.Parameters.Add(param);  

seehttp://msdn.microsoft.com/en-us/library/40959t6x(v=vs.110).aspx .请参阅http://msdn.microsoft.com/en-us/library/40959t6x(v=vs.110).aspx

试试AddWithValue

command.Parameters.AddWithValue("@username", username);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM