2016-05-18 6 views
-1

Ich habe diesen Code in meinem Projekt, um eine Abfrage auszuführen und in Excel einfügen. Ich habe es derzeit in einem Projekt arbeiten (mit einer anderen Abfrage), aber jetzt versuche ich, es mit einer anderen Abfrage zu arbeiten, und es wird nicht funktionieren. Wenn ich die Abfrage in SQL Server ausführe, funktioniert es jedoch. HierAbfrage funktioniert nicht in SQLReader

ist die Abfrage:

public static string Query (DateTime startDate, DateTime endDate) 
{ 
    //string Query = "SELECT * from access"; 
    string Query = "SELECT distinct s.first_nme + ' ' + s.last_nme as Student ,convert(Date, e.entrydate) as date ,od.u_order_id as 'Order#'"; 
    Query = Query + " " + "FROM enrollment e"; 
    Query = Query + " " + "join registration r on e.u_registration_id = r.u_registration_id"; 
    Query = Query + " " + "join student s on r.u_student_id = s.u_student_id"; 
    Query = Query + " " + "join order_pack_list opl on r.u_ord_pack_list_id = opl.u_ord_pack_list_id"; 
    Query = Query + " " + "join product p on opl.u_product_id = p.u_product_id"; 
    Query = Query + " " + "join order_detail od on opl.u_order_detail_id = od.u_order_detail_id"; 
    Query = Query + " " + "where e.entrydate >= " + startDate.ToString(); 
    Query = Query + " " + "and e.entrydate <= " + endDate.ToString(); 
    Query = Query + " " + "and p.prod_type_cd = 'B' and opl.modify_user_id = 'STCUSA30'"; 
    Query = Query + " " + "order by Student"; 

    return Query; 
} 

Der Grund gibt es eine kommentierte oute Linie auf der Oberseite zu testen, ist - wenn ich die einfache Abfrage ausführen, wird es nicht zum Absturz bringen.

Und hier ist der Code, den ich die Daten bekommen verwenden, um (und die Abfrage ausführen), das als ein Problem auszuschließen:

DateTime startDate = DateTime.Today.AddDays(-1); 
DateTime endDate = DateTime.Today; 

SqlDataReader rdr = null; 

try 
{ 

    // 2. Open the connection 
    conn.Open(); 

    string query = Query(startDate, endDate); 

    // 3. Pass the connection to a command object 
    using (SqlCommand cmd = new SqlCommand(query, conn)) 
    { 
      // 
      // 4. Use the connection 
      // 

      // get query results 
      rdr = cmd.ExecuteReader(); 

und stürzt auf der rdr Linie sagen,

Eine nicht behandelte Ausnahme des Typs 'System.Data.SqlClient.SqlException' in System.Data.dll

Zusätzliche Informationen aufgetreten: falsche Syntax nahe '12'.

Ich schaute online und es gibt keine Antworten, die zu meiner Situation gehören (das kann ich sagen).

Antwort

2

Basierend auf Ihren Fehler, können Sie sehen, wie diese möglicherweise eine Abfrage machen könnte, die wie folgt aussieht, die ungültige SQL ist (da diese konstanten Werte in Anführungszeichen eingewickelt werden müssen):

WHERE e.entryDate >= 12/31/2016 

Diese tritt auf, weil Sie Ihr DateTime-Objekt als eine Zeichenfolge verketten, aber da es nicht in Anführungszeichen eingeschlossen ist, bläht es sich auf. Sie könnten leicht Zitate in den diese verhindern:

Query = Query + " " + "where e.entrydate >= '" + startDate.ToString() + "' "; 
Query = Query + " " + "and e.entrydate <= " + endDate.ToString() + "' ";; 

Ein besserer Ansatz: Parametrierung

Je größer hier Problem ist, dass Sie mit der Parametrierung diese Werte zu füllen verwenden sollten diese Art von Problemen zu vermeiden (und jede Möglichkeit einer SQL Injection):

Query = Query + " " + "where e.entrydate >= @start"; 
Query = Query + " " + "and e.entrydate <= @end"; 

und dann das Hinzufügen dieser Werte als Parameter vor der Ausführung Ihrer Anfrage:

using (SqlCommand cmd = new SqlCommand(query, conn)) 
{ 
     // Add your parameters 
     cmd.Parameters.AddWithValue("@start",startDate); 
     cmd.Parameters.AddWithValue("@end",endDate); 

     // Execute here 
} 
+0

Danke, das hat funktioniert. Seltsamerweise habe ich die Anführungszeichen in meiner anderen App nicht verwendet und es hat funktioniert. – djblois

+0

Sie müssen in Ihrer anderen App Ints verwenden, für die keine Anführungszeichen erforderlich sind – MIKE