2016-09-01 17 views
5

Tôi có một cột ngày trong cơ sở dữ liệu của mình. Tôi có hai nút dữ liệu (quá khứ và hiện tại) ba nút radio được gọi là, nhà bán lẻ, đại lý phụ và đại lý. Tôi muốn hiển thị tất cả các bản ghi giữa hai ngày trong datagrid của tôi. Nhưng trước tiên tôi sẽ đặt hai ngày và chọn một nút radio và nhấp vào nút tìm kiếm. Tôi đã giải quyết được vấn đề của mình trong radiobuttons. Tôi chỉ cần đặt "OR" trong truy vấn của tôi để nó sẽ vẫn còn ngay cả khi vấn đề m trong việc có được ngày giữa hai ngày wont. Tôi không sử dụng datime vì tôi đã sử dụng varchar làm kiểu dữ liệu cho ngày trong cơ sở dữ liệu của mình. Tôi không thể thay đổi nó thành datetime bởi vì đó là những gì giáo viên của tôi đã cho tôi.Lấy tất cả hồ sơ từ cơ sở dữ liệu giữa hai ngày C#

Đây là mã của tôi. Cảm ơn bạn rất nhiều.

public static List<Retailer> GetDataByType(string type, string past, string present) 
    { 
     List<Retailer> data = new List<Retailer>(); 

     MySqlConnection con = DBConnection.ConnectDatabase(); 
     try 
     { // AND 
      MySqlCommand cmd = new MySqlCommand("SELECT * FROM " + tablename + " WHERE date BETWEEN '" + past + "' AND '" + present + "'" + "' OR type LIKE '%" + type + "%'", con); 
      MySqlDataReader reader = cmd.ExecuteReader(); 

      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        Retailer rawData = new Retailer(); 
        rawData.Date = reader.GetString(0); 
        rawData.Walletid = reader.GetString(1); 
        rawData.Fname = reader.GetString(2); 
        rawData.Lname = reader.GetString(3); 
        rawData.Birthdate = reader.GetString(4); 
        rawData.Address = reader.GetString(5); 
        rawData.Province = reader.GetString(6); 
        rawData.City = reader.GetString(7); 
        rawData.Balance = reader.GetDouble(8); 
        rawData.Frozen = reader.GetDouble(9); 
        rawData.Sponsor_id = reader.GetString(10); 
        rawData.Share = reader.GetDecimal(11); 
        rawData.Email = reader.GetString(12); 
        rawData.Password = reader.GetString(13); 
        rawData.Type = reader.GetInt32(14); 
        data.Add(rawData); 

        MessageBox.Show(rawData.Date); 
       } 
      } 
      reader.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      con.Close(); 
     } 

     return data; 
    } 
} 
+0

chuyển đổi ngày chuỗi thành một ngày: http://stackoverflow.com/questions/5201383/how-to-convert-a-string-to-date-in-mysql – Jens

+0

Định dạng của 'quá khứ' và 'present' là điểm mấu chốt ở đây. Bạn cần có chúng ở định dạng mặc định của MySQL. Tuy nhiên, giải pháp tối ưu là sử dụng các tham số và chỉ định kiểu là DateTime. – user3185569

+0

Có thể trùng lặp: http://stackoverflow.com/questions/14952518/mysql-date-time-format-using-c-sharp – user3185569

Trả lời

0

Vì cột ngày của bạn là một varchar, bạn sẽ phải sử dụng str_to_date. Tôi sẽ đề nghị bạn sử dụng tham số trong đó chuỗi trong truy vấn đến từ người dùng, ngay cả khi bạn không được yêu cầu, vì điều này sẽ giúp bạn tiết kiệm từ sql injections.

MySqlCommand cmd = new MySqlCommand("SELECT * FROM " + tablename + " WHERE STR_TO_DATE(`date`, '%Y/%m/%d') BETWEEN STR_TO_DATE(@pastvalue, '%Y/%m/%d') AND STR_TO_DATE(@presentvalue, '%Y/%m/%d') OR type LIKE '%" + type + "%'", con); 
command.Parameters.AddWithValue("@pastvalue", past); 
command.Parameters.AddWithValue("@presentvalue", present); 
MySqlDataReader reader = cmd.ExecuteReader(); 

Tôi giả sử rằng ngày được lưu trữ ở định dạng sau 2016/09/01. Nếu ngày tháng trong một từ khác thì thay đổi định dạng của str_to_date tương ứng.

không có tham số truy vấn sẽ trông như thế

MySqlCommand cmd = new MySqlCommand("SELECT * FROM " + tablename + " WHERE STR_TO_DATE(`date`, '%Y/%m/%d') BETWEEN STR_TO_DATE(past, '%Y/%m/%d') AND STR_TO_DATE(present, '%Y/%m/%d')" + "' OR type LIKE '%" + type + "%'", con); 
0

Nếu bạn không thể thay đổi kiểu của cột ngày để Datetime sau đó truy vấn của bạn sẽ không bao giờ làm việc bạn phải tự thực hiện thao tác mã ngày của riêng bạn giả sử bạn có cùng ngày và thời gian định dạng để so sánh trong truy vấn của bạn truy xuất tất cả các kỷ lục bất kể những gì ngày sau đó được thử đoạn mã sau

FilterData(ref rawData); 

và định nghĩa hàm được sau

private void FilterData(ref List<Retailer> data) 
{ 
    for(int i = 0 ; i < data.Count ; i++) 
    { 
    Retailer d = data[i]; 
    DateTime present = DateTime.parse(present); 
    DateTime past = DateTime.parse(past); 
    DateTime dt = DateTime.parse(d.Date); 

    if(!(dt >= past && dt < present)) 
     data.RemoveAt(i); //remove record it is not between present and past 
    } 
} 
+0

thanks sir @zain :) –

Các vấn đề liên quan