SQL: "Syntaxe incorrecte près du mot key 'WHERE'" lors de la comparaison de deux dates

Ce qui suit est mon instruction MS sql-server, qui est utilisée dans mon application C # Windows. Comme son titre l'indique, il sélectionne tous les numéros de produit qui se trouvent entre les dates de la textbox. Je suis assez inexpérimenté avec SQL, donc ma tentative peut être une atrocité. SQL semble le penser.

ssortingng strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "')"; 

Message d'erreur SQL: "Syntaxe incorrecte près du mot key" WHERE "."

 ssortingng strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "')"; 

C'est parce que la clause WHERE devrait précéder ORDER BY

 ssortingng strSQL = "SELECT * FROM HISTORY WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "' ORDER BY productNumber)" ; 
 " SELECT * FROM HISTORY WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "') ORDER BY productNumber " 

l'ordre par va après la clause where

Si ce n'est que des dates, il n'y a pas beaucoup de chance d'injection SQL surtout si vous le validez.

Si vous devez passer une date en tant que string à SQL Server, il doit être au format YYYYMMDD non ambigu. Mais j'appendais aussi la validation de l'input comme date.

Avoir ceci avant cette déclaration

 CultureInfo provider = CultureInfo.InvariantCulture; 

Ensuite, changez-le en

 ssortingng strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" + DateTime.ParseExact(KHDate1Box.Text, "d", provider).ToSsortingng("yyyyMMdd") + "' and @end_date <= '" + DateTime.ParseExact(KHDate2Box.Text, "d", provider).ToSsortingng("yyyyMMdd") + "')"; 

Catch erreurs de ne pas parsingr la date.

Référence: J'ai utilisé "d" mais voici la list des formats de date standard

J'ai remarqué que vous utilisez @strt_date et @end_date (qui sont des variables T-SQL) comme noms de colonnes. En outre, la clause ORDER BY doit être après la clause WHERE .


En aparté, il existe plusieurs raisons pour lesquelles vous ne devriez pas coder une requête de cette manière. Google "Injection SQL" pour un problème de security très révélateur.

Utilisez plutôt des requêtes paramétrées. Ils sont plus sûrs et less sujets aux erreurs de syntaxe provoquées par des caractères non valides dans les champs de valeur.

http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06