Функция.HasRows() на считывателе данных работает вечно

У меня есть простой код, if заявление о проверке HasRows считывателя данных и по какой-то причине, когда я запускаю свой код в Visual Studio 2017, требуется целая вечность, чтобы оценить и вернуть ответ (во время написания этого мой код работал в течение 4 минут). Какие-либо предложения?

 Dim cmd As OdbcCommand
 Dim rdr As OdbcDataReader

cmd = New OdbcCommand("select GLPN,GLFY,GLDCT,GLDOC,GLCO,GLDGJ,GLANI,GLSBL,GLLT,GLCRCD,GLAA,GLU,GLGLC,GLEXA,GLICUT,GLR2,GLR1,GLSFX,GLOKCO" _
                      & ",GLEXR,GLODOC,GLPKCO,GLPDCT,GLCN,GLDKJ,GLVINV,GLIVD,GLPO,GLDCTO,GLLNID,GLTORG,GLAN8,GLICU,GLOPSQ,GLJBCD" _
                      & ",GLACR,GLABR2,GLABR1,GLDGJ,GLLT,GLCRCD,GLEXA,GLICUT,GLEXR,GLDKJ,GLIVD,GLAN8,GLICU,GLACR,GLKCO,GLSBLT,GLOBJ,GLSUB,GLJELN,GLEXTL,GLCRR,GLBCRC" _
                      & " from " _
                      & "PRODDTA.F0911 where GLPOST = 'P' and GLDGJ >= ? and GLDGJ <= ? and (GLLT = 'AA' or GLLT = 'CA') and GLDOC = 206940", cnn)
cmd.Parameters.Add("?GLUPMJs", OdbcType.Int).Value = todaysdate - 14
cmd.Parameters.Add("?GLUPMJe", OdbcType.Int).Value = todaysdate
cnn.Open()
cmd.CommandTimeout = 300
rdr = cmd.ExecuteReader

If rdr.HasRows() Then

    'Do a bunch of stuff

End if

Edit1: По-прежнему получаю забавную проблему, но я заметил, что это только в одном месте, у меня есть проверка "HasRows()" в нескольких местах, и она работает быстро 3 мс и тому подобное. это только по одному запросу.

Edit2: запрос, на который я ссылался выше, очень быстро выполняется на SQL-разработчике, всего 1,202 секунды, когда я пытался в последний раз, он также не возвращает никаких сообщений.

Edit3: мне интересно, имеет ли это какое-то отношение к количеству полей, которые я возвращаю, другие запросы, которые быстро выполняются в этой строке, возвращают гораздо меньшее количество полей.

4 ответа

Решение

Причина задержки в HasRows() заключается в том, что на самом деле ExecuteReader не выполнил запрос, он откладывает выполнение до тех пор, пока он не понадобится. HasRows - тот, кто выполняет это. спасибо Dwillis за указание на это.

Я проверил это, поставив перед ним строку кода, и именно здесь была задержка, и когда hasRows запускалась, это было быстро.

Интересно, что тот же sql-запуск в Sql Management Studio запускается за 1,5 секунды, возвращая все строки, но в Коде это требуется навсегда, что является другой проблемой, но также может быть связано с настройками ODBC.

Это может не ускорить его, но вы пробовали??

While rdr.Read()
'Do a bunch of stuff
End While

РЕДАКТИРОВАТЬ:

Dim dt As DataTable = New DataTable
dt.Load(rdr)
If dt.Rows.Count >= 0 Then
   'Do a bunch of stuff
End If

Возможно, проблема в том, что для выполнения запроса требуется много. Если вас интересует только проверка существования записей, вы можете выполнить запрос с помощью "SELECT TOP 1 1и использовать ExecuteScalar вместо ExecuteReader,

Кажется, что вы не единственный, кто испытывает проблемы с HasRows метод. В этом посте OP указал на проблему с этим методом, хотя это SQL-SERVER. Но я думаю, что решение может быть полезным, так как оба DataReader наследуются от одного и того же класса, и они тесно связаны.

Если вы прочитаете пост, на который они ссылаются в вопросе, и ответ с наибольшим количеством голосов, вы увидите, что они пришли к выводу, что HasRows показал некорректное поведение, когда выполнение SQL-запроса вернуло не только некоторые результаты данных, но и сообщение. В итоге они использовали альтернативный способ проверить, есть ли какие-либо данные в считывателе данных, основанные на Read() метод, который оказался более надежным.

В их случае проблема заключалась в том, что HasRows свойство было установлено в false, когда читатель действительно содержал данные, но, возможно, это связано с вашей проблемой производительности. Вы обязательно должны попробовать Read Метод, чтобы быть уверенным, что ваш запрос не является проблемой.

PS: еще одна интересная ссылка с человеком, сообщающим о той же проблеме.

Другие вопросы по тегам