[英]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.