2010-07-09 11 views
0

J'utilise AS 400 OLEDB avec .NET. Il utilise '?' au lieu de « @param pour lier les paramètres avec une commande Maintenant, il y a une situation où la commande est commeLa liaison des paramètres à la commande OLEDB génère une erreur

SELECT ... 
FROM 
    (SELECT ... 
     ROW_NUMBER() OVER(ORDER BY ColumnName) as RowNum 
    FROM Employees e 
    ) as DerivedTableName 
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1 

Maintenant, ma commande devient

SELECT ... 
FROM 
    (SELECT ... 
     ROW_NUMBER() OVER(ORDER BY ColumnName) as RowNum 
    FROM Employees e 
    ) as DerivedTableName 
WHERE RowNum BETWEEN ? AND (? + ?) - 1 

Maintenant, quand je lie les paramètres comme

myCommand.Parameters.Add(new OleDbParameter("?",startRowIndex)); 
myCommand.Parameters.Add(new OleDbParameter("?", startRowIndex)); 
myCommand.Parameters.Add(new OleDbParameter("?", MaximumRows)); 

Il émet une erreur

SQL0417: Combination of parameter markers not valid. 
Cause . . . . . : The statement string specified as the object of a PREPARE statement contains a predicate or expression where parameter markers have been used as operands of the same operator. The following restrictions apply to the use of parameter markers: -- Both the operands in a predicate cannot be parameter markers. For example, specifying predicates of the form: ? = ?  or ? = (SELECT ? FROM x) are not valid. 

Comment lier des paramètres dans cette situation? Je veux éviter l'injection sql :)

Répondre

3

Essayez de changer les noms des paramètres

myCommand.Parameters.Add(new OleDbParameter("@startRowIndex",startRowIndex)); 
myCommand.Parameters.Add(new OleDbParameter("@startRowIndex2", startRowIndex)); 
myCommand.Parameters.Add(new OleDbParameter("@MaximumRows", MaximumRows)); 

mais laisser le SQL comme il est.

+0

Merci pour la réponse Chris. En OLEDB les paramètres vont avec index et symbole '?' et pas avec le nom '@param'. Cela fonctionne sur SQLServer. Une idée? –

+0

chris a raison, même si j'utilise l'accès, j'utilise? comme param –

+0

Il est, mais le problème est toujours là à cause de deux paramètres à l'intérieur d'un seul bloc (? +?). Que faites-vous dans l'accès pour s'en sortir? Vérifiez ma description de l'erreur ci-dessus. –