C# 为函数指定的参数值无效。[参数=1,函数名称(如果已知)=isnull]
我想从列与给定参数匹配的表中进行选择。如果参数为null,我想从表中选择所有记录。下面的相关代码就是引发此错误的原因C# 为函数指定的参数值无效。[参数=1,函数名称(如果已知)=isnull],c#,c#-4.0,sql-server-ce,sql-server-ce-4,C#,C# 4.0,Sql Server Ce,Sql Server Ce 4,我想从列与给定参数匹配的表中进行选择。如果参数为null,我想从表中选择所有记录。下面的相关代码就是引发此错误的原因 private static string _dbJobCreate = "CREATE TABLE Job (jID int primary key identity(1,1), jAddress nvarchar(64) not null);"; private static string _dbJobSelect = "SELECT jID FROM
private static string _dbJobCreate =
"CREATE TABLE Job (jID int primary key identity(1,1), jAddress nvarchar(64) not null);";
private static string _dbJobSelect =
"SELECT jID FROM Job WHERE jAddress = @jAddress OR @jAddress IS NULL";
public static DataTable GetJobs(string jAddress)
{
SqlCeParameter pjAddress = new SqlCeParameter();
pjAddress.ParameterName = "@jAddress";
if (!string.IsNullOrEmpty(jAddress))
{
pjAddress.Value = jAddress;
}
else
{
pjAddress.Value = DBNull.Value;
}
return ExecuteDataTable(_dbJobSelect, pjAddress);
}
异常:为函数指定的参数值无效。[参数=1,函数名如果已知=isnull]
如何在SQLCE中高效地完成这项工作而不出错?我的解决方案是从数据库中选择所有行,并在传入参数时过滤.NET中的行。如果有大量的工作,这可能会变得很麻烦,尽管我想如果发生这种情况,我会转移到一个真正的数据库
private static string _dbJobSelect = "SELECT jID, jAddress FROM Job";
public static DataTable GetJobs(string jAddress)
{
DataTable dt = ExecuteDataTable(_dbJobSelect);
if (!string.IsNullOrEmpty(jAddress))
{
DataView dv = dt.DefaultView;
dv.RowFilter = string.Format("jAddress = '{0}'", jAddress);
dt = dv.ToTable();
}
return dt;
}
通过指定传递给查询的参数类型,可以避免此错误。因此,您需要做的就是:
pjAddress.DbType = DbType.String;
您可以将其转换为varchar
我最近遇到了这个问题,发现我实际上没有将查询参数添加到IDB命令中。我不确定ExecuteDataTable方法是什么样子,但我的代码类似于以下代码,其中db是IDbConnection实例:
var sql = "SELECT jID FROM Job WHERE jAddress = @jAddress OR @jAddress IS NULL";
var cmd = db.CreateCommand();
cmd.CommandText = sql;
var param = cmd.CreateParameter();
param.DbType = DbType.String;
param.ParameterName = "@jAddress";
param.Value = string.IsNullOrEmpty(pjAddress) ? DBNull.Value : (object)pjAddress;
cmd.Parameters.Add(param); // THIS WAS THE STEP I WAS MISSING!!!
// ... rest of the code to execute the query and load the results ...
添加cmd.Parameters.Addparam后,异常消失。有用的讨论:对我来说,这是一个完美的解决方案。
var sql = "SELECT jID FROM Job WHERE jAddress = @jAddress OR @jAddress IS NULL";
var cmd = db.CreateCommand();
cmd.CommandText = sql;
var param = cmd.CreateParameter();
param.DbType = DbType.String;
param.ParameterName = "@jAddress";
param.Value = string.IsNullOrEmpty(pjAddress) ? DBNull.Value : (object)pjAddress;
cmd.Parameters.Add(param); // THIS WAS THE STEP I WAS MISSING!!!
// ... rest of the code to execute the query and load the results ...