Получить данные строки из базы данных и преобразовать их в объект даты в запросе - PullRequest
0 голосов
/ 02 января 2012

Я разрабатываю программное обеспечение для банкомата, в котором я хочу получить отчет, введя дату начала и дату окончания.Дата сохранения в моей таблице в виде строки dd/MM/yyyy.Я пытаюсь следующий код и получаю исключение неправильного синтаксиса.

public DataTable getReportByDate(DateTime startDate, DateTime endDate)
{
   try
   {
      DataTable table = new DataTable();

      using (SqlConnection connection = new SqlConnection(connectionString))
      {
         SqlDataAdapter dataAdapter = new SqlDataAdapter("Select * from [Transaction] Where CAST(CurrDate AS Date) >=" + startDate + " AND CAST(CurrDate AS Date) <=" + endDate + ";", connectionString);

         // Create a command builder to generate SQL update, insert, and
         // delete commands based on selectCommand. These are used to
         // update the database.
         SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

         // Populate a new data table and bind it to the BindingSource.
         table.Locale = System.Globalization.CultureInfo.InvariantCulture;
         dataAdapter.Fill(table);
      }
      return table;
   }
   catch (Exception e)
   {
       return null;
   }
}

Пожалуйста, помогите мне.

С уважением

Ответы [ 4 ]

1 голос
/ 02 января 2012

Хорошо, сначала отключите, НЕ превратите исключение в возвращаемое значение null

catch(Exception e)
{
   return null;
}

Это плохая практика, так как вы поглощаете КАЖДОЕ возможное исключение.Вместо этого вы должны только перехватывать исключения, которые должен выдавать адаптер sql, или даже лучше: не перехватывать их, а документировать их и перехватывать их дальше, потому что если что-то идет не так в этом методе, это означает ваше соединение SQL или ваш кодсломано.Если вы оставите все как есть, вы только скрываете проблемы и значительно усложняете отладку.

Во-вторых, вы должны использовать параметры в своем запросе.

Теперь к синтаксической ошибке: startDate и endDate имеют типDateTime, поэтому вы должны сначала преобразовать их в строку с .ToString("dd/MM/yyyy") - это будет меньше проблем с параметрами.

1 голос
/ 02 января 2012

Вы должны обязательно использовать параметры в своем запросе - как во избежание атак с использованием SQL-инъекций, так и для повышения производительности (путем повторного использования плана выполнения).Никто до сих пор не показал это - так вот оно:

public DataTable getReportByDate(DateTime startDate, DateTime endDate)
{
    DataTable table = new DataTable();

    string sqlStmt =  
        "SELECT * FROM [dbo].[Transaction] " + 
        "WHERE CAST(CurrDate AS DATE) >= @startDate " + 
        "AND CAST(CurrDate AS DATE) <= @endDate";

      using (SqlConnection connection = new SqlConnection(connectionString))
      using (SqlCommand cmd = new SqlCommand(sqlStmt, connection))
      {
         cmd.Parameters.Add("@startDate", SqlDbType.Date).Value = startDate.Date;
         cmd.Parameters.Add("@endDate", SqlDbType.Date).Value = endDate.Date;

         SqlDataAdapter adapter = new SqlDataAdapter(cmd);
         adapter.Fill(table);
      }

      return table;
   }
}
1 голос
/ 02 января 2012

Изменить

SqlDataAdapter dataAdapter = new SqlDataAdapter("Select * from [Transaction] Where CAST(CurrDate AS Date) >=" + startDate + " AND CAST(CurrDate AS Date) <=" + endDate + ";", connectionString);

На

SqlDataAdapter dataAdapter = new SqlDataAdapter("Select * from [Transaction] Where CAST(CurrDate AS Date) >='" + startDate.ToString("yyyy-MM-dd HH:mm:ss") + "' AND CAST(CurrDate AS Date) <='" + endDate.ToString("yyyy-MM-dd HH:mm:ss") + "';", connectionString);

ОБНОВЛЕНИЕ:

SqlDataAdapter dataAdapter = new SqlDataAdapter("Select * from [Transaction] Where CAST(CurrDate AS Date) >='" + startDate.ToString("dd/MM/yyyy") + "' AND CAST(CurrDate AS Date) <='" + endDate.ToString("dd/MM/yyyy") + "';", connectionString);
0 голосов
/ 02 января 2012

Я попробовал, sql нормально работает в редакторе запросов, однако, похоже, он может работать только при параметризации. Итак, я делаю репост кода, я заметил, что модератор преобразовал мой первоначальный ответ в комментарий.

public DataTable getReportByDate(DateTime startDate, DateTime endDate)
{
DataTable table = new DataTable();
            string query = "select * from [transaction] where cast(currdate as date) >= @startdate and cast(currdate as date) <= @enddate";
            using (SqlConnection connection = new SqlConnection("server=(local);database=quicksilver;integrated security=true"))
            {
                connection.Open();
                SqlCommand command = new SqlCommand(query);
                command.Parameters.AddWithValue("@startdate", startdate);
                command.Parameters.AddWithValue("@enddate", enddate);
                command.Connection = connection;

                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                //
                SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
                dataAdapter.Fill(table); 

            }
return table;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...