Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为函数指定的参数值无效。[参数=1,函数名称(如果已知)=isnull]_C#_C# 4.0_Sql Server Ce_Sql Server Ce 4 - Fatal编程技术网

C# 为函数指定的参数值无效。[参数=1,函数名称(如果已知)=isnull]

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

我想从列与给定参数匹配的表中进行选择。如果参数为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 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 ...