2016-05-18 18 views
-1

クエリを実行してExcelに貼り付けるために、このコードをプロジェクトに作成しました。私は現在、1つのプロジェクト(別のクエリで)で作業していますが、今は別のクエリで動作するようにしようとしていますが、動作しません。ただし、SQLサーバーでクエリを実行する場合は動作します。ここでSQLReaderでクエリが機能しない

はクエリです:上部のコメントアウト行がある

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

理由は、テストすることである - 私は、単純なクエリは、それがクラッシュしないことを実行したとき。ここ

そして

は、私が問題としてそれを除外するために、日付を取得(およびクエリを実行)するために使用するコードです:

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

、それは、言っRDRライン上でクラッシュし

はのSystem.Data.dll

に追加情報が発生型「System.Data.SqlClient.SqlException」の未処理の例外:付近に正しくない構文「12」を。

私はオンラインで見ましたが、私の状況(私が知ることができる)に関する回答はありません。

答えて

2

あなたの誤差に基づいて、無効なSQL(これらの定数の値は引用符でラップする必要があるよう)である、これは潜在的に次のようなクエリをレンダリングする可能性がどのように見ることができる:

WHERE e.entryDate >= 12/31/2016 

このDateTimeオブジェクトを文字列として連結しているために引用符で囲まれていないため、文字化けが発生しています。あなたは簡単にこれを防ぐために引用符を追加することができます。

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

より良いアプローチを:パラメータ化

は、ここではもっと大きな問題は、(あなたは、この種の問題を避けるために、これらの値を移入するためにパラメータを使用しなければならないということですそして、SQLインジェクションの可能性):

01:

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

そして、前にクエリを実行するパラメータとして、これらの値を追加します

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

     // Execute here 
} 
+0

ありがとうございました。奇妙なことに、私は他のアプリで一重引用符を使わず、うまくいきました。 – djblois

+0

引用符を必要としない他のアプリでintを使用している必要があります – MIKE

関連する問題