none
не работает запрос в vb.net с использованием datetimepicker RRS feed

  • Вопрос

  • Добрый день!

    Не могу понять почему не выполняется запрос  вида :

    select  Sum(bytesrecvd),sum( bytessent) from tablelog  where  logtime >convert(date,'2013.09.25')and logtime < convert(date,'2013.09.30')

    вот код в приложении:

                        

     Dim str As String = "select  Sum(bytesrecvd),Sum (bytessent) from tablelog where  (logtime >convert(date," &     DateTimePicker1.Value.ToString("yyyy.MM.dd") & "))and (logtime < convert(date," & DateTimePicker2.ToString("yyyy.MM.dd") & ")) "

         

         Me.tableLogTableAdapter.Connection.Open()
         Me.tableLogTableAdapter.Adapter.SelectCommand.CommandText = str   


            me.tableLogTableAdapter.Adapter.SelectCommand.ExecuteScalar()
            Me.tableLogTableAdapter.Connection.Close()
            TMGDataSet.Clear()
            Me.tableLogTableAdapter.Fill(Me.tablelogDataSet.tablelog)

    при выполнении кода вываливается ошибка 

    Ссылка на объект не указывает на экземпляр объекта.  что с этим делать?



    • Изменено Aleks__ 30 сентября 2013 г. 7:18
    30 сентября 2013 г. 7:00

Ответы

  • Вроде, вот так должно быть:

    Dim conn As New SqlConnection(connectionString:="указываем строку подкл-я")
    Dim command As SqlCommand = New SqlCommand(str, conn)
    conn.Open()
    Me.TableLogTableAdapter.Adapter.SelectCommand = command
    DataSet.Clear()
    Me.TableLogTableAdapter.Fill(Me.DataSet.TableLog) 
    conn.Close()

    P.s. Я на VB не пишу, просто по аналогии с C#, а вообще вот здесь посмотрите пример.

    30 сентября 2013 г. 12:09
    Отвечающий
  • Указать нужное значение в строке подключения.
    30 сентября 2013 г. 12:25
    Отвечающий
  • Тему можно закрывать проблему уже решил следующим путем.

    Добавил еще один индекс в таблицу LogTable и в коде указал timeout selectcomand =1000000000

    вот кусочек кода:

    Me.TableLogTableAdapter.Connection.Open()
            Me.TableLogTableAdapter.Adapter.SelectCommand.CommandText = "select * from TableLog where  (logtime >convert(date,'" & DateTimePicker1.Text & "')) and (logtime < convert(date,'" & DateTimePicker2.Text & "')) "
           Me.TableLogTableAdapter.Adapter.SelectCommand.CommandTimeout = 1000000000

            Me.TableLogTableAdapter.Adapter.SelectCommand.ExecuteScalar()
            Me.TableLogTableAdapter.Connection.Close()
            Me.TableLogTableAdapter.Fill(Me.TMGDataSet.TableLog)

    Теперь все отлично работает. 

    22 октября 2013 г. 12:31

Все ответы

  • Добрый день.

    Вы не инициализировали команду выборки. Правильно делать так:

        Dim command As SqlCommand = New SqlCommand(str)
        Me.tableLogTableAdapter.SelectCommand = command

    30 сентября 2013 г. 8:34
    Отвечающий
  • Странно теперь стал ругаться на строке me.tableLogTableAdapter.Adapter.SelectCommand.ExecuteScalar()

     ExecuteScalar: Свойство Connection не инициализировано.

    Это получается что нужно указать новое подключение? 

    30 сентября 2013 г. 9:44
  • Тот же подключение, что у вас указано в адаптере, передайте вторым параметром в конструктор команды.
    30 сентября 2013 г. 11:09
    Отвечающий
  • можно у Вас попросить пример как это сделать.Если я правильно понял то нужно сделать так:

      Dim conn As New SqlConnection(connectionString:="указываем строку подкл-я")
            Dim command As SqlCommand = New SqlCommand(str, conn)
                    conn.Open()
           
            Me.TableLogTableAdapter.Adapter.SelectCommand = command
            Me.TableLogTableAdapter.Adapter.SelectCommand.ExecuteScalar()
            ConnClose()
           DataSet.Clear()
            Me.TableLogTableAdapter.Fill(Me.DataSet.TableLog)


    30 сентября 2013 г. 11:50
  • Вроде, вот так должно быть:

    Dim conn As New SqlConnection(connectionString:="указываем строку подкл-я")
    Dim command As SqlCommand = New SqlCommand(str, conn)
    conn.Open()
    Me.TableLogTableAdapter.Adapter.SelectCommand = command
    DataSet.Clear()
    Me.TableLogTableAdapter.Fill(Me.DataSet.TableLog) 
    conn.Close()

    P.s. Я на VB не пишу, просто по аналогии с C#, а вообще вот здесь посмотрите пример.

    30 сентября 2013 г. 12:09
    Отвечающий
  • Спасибо за помощь. Есть еще маленький вопросик как быть если вовремя выполнения запроса превышен timeout 

    Истекло время ожидания (Timeout). Время ожидания истекло до завершения операции или сервер не отвечает.Каким образом поднять Timeout

    30 сентября 2013 г. 12:24
  • Указать нужное значение в строке подключения.
    30 сентября 2013 г. 12:25
    Отвечающий
  • Спасибо, за работало.
    30 сентября 2013 г. 16:51
  • Не забудьте указать ответ или ответы, которые помогли в решении вашей проблемы.

    30 сентября 2013 г. 17:12
    Отвечающий
  • Странно как-то запрос работает. Все вроде выполняется но в конце вываливается ошибка Истекло время ожидания (Timeout). Время ожидания истекло до завершения операции или сервер не отвечает. Таймаут я увеличивал но от этого ничего не изменилось :( 
    2 октября 2013 г. 12:52
  • Лучше - один топик один вопрос. Так проще искать по форума. Проверьте, что у вас строка подключения правильная. Например, выполните запрос "select  top 1 * from tablelog". Если с ним все нормально. То значит ваш запрос просто не успевает выполниться. Постройте индекс по полю longtime. Если и такой запрос упадет, то у вас проблемы с сетью, строкой подключения, настройками сервера...

    3 октября 2013 г. 6:24
    Отвечающий
  • Вы знает запрос вида :

    select top (1000)* from tablelog where  (logtime >convert(date,'" & DateTimePicker1.Text & "')) and (logtime < convert(date,'" & DateTimePicker2.Text & "')) " работает на отлично

    правда я переписал код 

    Me.TableLogTableAdapter.Connection.Open()
            Me.TableLogTableAdapter.Adapter.SelectCommand.CommandText = "select * from TableLog where  (logtime >convert(date,'" & DateTimePicker1.Text & "')) and (logtime < convert(date,'" & DateTimePicker2.Text & "')) "
                Me.TableLogTableAdapter.Adapter.SelectCommand.ExecuteScalar()
            Me.TableLogTableAdapter.Connection.Close()
            TMGDataSet.Clear()
            Me.TableLogTableAdapter.Fill(Me.TMGDataSet.TableLog)

    все работает нормально. Но стоит добавить еще один критерий отбора например: ClientUserName ='имя пользователя' то вылетает ошибка таймаута. 

     'Me.TableLogTableAdapter.Adapter.SelectCommand.CommandText = "select  * from TableLog where logtime >convert(date,'" & DateTimePicker1.Text & "')and logtime < convert(date,'" & DateTimePicker2.Text & "') and ClientUserName =' Вася Петечкин'"

    Я делал выпорку по конкретному пользователю там всего 1000 строк. Не понимаю почему Top 1000 работает нормально , а с пользователем вылетает. Такая же беда с запросом в самом начале этого обсуждения.


    • Изменено Aleks__ 3 октября 2013 г. 11:45
    3 октября 2013 г. 11:41
  • А из Management Studio запрос с пользователем сколько по времени выполняется? Прямо взять реальный запрос который уходит из приложения и выполнить в Management Studio
    3 октября 2013 г. 12:46
    Отвечающий
  • В Management Studio запрос выполняется 45  мин   иногда больше часа.  
    4 октября 2013 г. 8:04
  • 45 минут???? 

    Или стройте индексы по полям по которым поиск, что поможет увеличить скорость выборки, либо разбивайте логи по нескольким таблица и пытайтесь на этом выиграть время...

    4 октября 2013 г. 13:35
    Отвечающий
  • Тему можно закрывать проблему уже решил следующим путем.

    Добавил еще один индекс в таблицу LogTable и в коде указал timeout selectcomand =1000000000

    вот кусочек кода:

    Me.TableLogTableAdapter.Connection.Open()
            Me.TableLogTableAdapter.Adapter.SelectCommand.CommandText = "select * from TableLog where  (logtime >convert(date,'" & DateTimePicker1.Text & "')) and (logtime < convert(date,'" & DateTimePicker2.Text & "')) "
           Me.TableLogTableAdapter.Adapter.SelectCommand.CommandTimeout = 1000000000

            Me.TableLogTableAdapter.Adapter.SelectCommand.ExecuteScalar()
            Me.TableLogTableAdapter.Connection.Close()
            Me.TableLogTableAdapter.Fill(Me.TMGDataSet.TableLog)

    Теперь все отлично работает. 

    22 октября 2013 г. 12:31