2012-12-30 2 views
3

열이 주어진 매개 변수와 일치하는 테이블에서 선택하려고합니다. 매개 변수가 null 인 경우 테이블에서 모든 레코드를 선택합니다. 아래의 관련 코드는이 오류를 발생시키는 것입니다.함수의 지정된 인수 값이 유효하지 않습니다. [Argument # = 1, 함수 이름 (알려진 경우) = isnull]

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); 
    } 

예외 : The specified argument value for the function is not valid. [ Argument # = 1,Name of function(if known) = isnull ]

어떻게 효율적으로 SQLCE에서 오류없이이 작업을 수행 할 수 있습니까?

+1

유용한 토론 : http://social.msdn.microsoft.com/Forums/sqlserver/en-US/83821937-3929-4901-a78e-b675cf8a70ca/how-to-send-a-null-value-as -a-parameter –

답변

1

내 솔루션은 데이터베이스에서 모든 행을 선택하고 매개 변수가 전달 된 경우 .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; 
} 
2

쿼리에 전달되는 매개 변수 유형을 지정하면이 오류를 피할 수 있습니다. 그래서 당신이 할 필요가있다 :

pjAddress.DbType = DbType.String; 
+1

제게 이것은 완벽한 해결책이었습니다. – Phil

0

당신은 내가 최근에이 문제에 달려 내가 실제로 IDbCommand에 쿼리 매개 변수를 추가하지 않은 것을 발견 varchar

SELECT jID FROM Job WHERE jAddress = @jAddress 
    OR cast(@jAddress AS varchar(4000)) IS NULL 
0

에 전송할 수 있습니다. 나는 당신의 ExecuteDataTable 방법은 어떻게 생겼는지 모르겠지만, (dbIDbConnection 인스턴스 인 경우) 내 코드는 다음과 유사했다 :

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.Add(param)를 추가 한 후, 예외가 사라졌다.

관련 문제