Это невероятно срочно, мне нужно представить это приложение за 3 с половиной часа.SqlDataReader получает строки, когда нет данных
Мое приложение проверяет источник данных, чтобы узнать, существует ли в базе данных значение и изменяет значения в зависимости от того, было ли найденное значение найдено. Проблема в том, что я запустил sql-запрос со значением, указанным в SSMS, и никакие строки не были возвращены, и все же мой DataReader говорит, что у него есть строки.
Это значит, что мое приложение сообщает неточно. Вот мой код:
Using conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=Testing; Integrated Security=True;")
Dim cmd As New SqlCommand(sql, conn)
conn.Open()
Dim reader As SqlDataReader = cmd.ExecuteReader
If reader.HasRows Then
Value = True
AcctNumber = reader(1)
End If
reader.Close()
End Using
Я удалил код, который не имеет отношения к этому посту, но то, что вы можете знать:
Значение Boolean AcctNumber является строка
Как это приложение для работы, я бы предпочел не включать SQL Query. Проблема в том, что читатель. Если я прокомментирую Value = True
, я получаю правильную информацию, но это исключение будет означать, что в случае, когда значение должно быть истинным, оно также сообщит неточно.
Заранее благодарен!
EDIT: Полный исходный код:
Case "Business"
' Change the number format to local because that's what it is in the db
If Microsoft.VisualBasic.Left(NumberToCheck, 2) = "27" Then
NumberToCheck = NumberToCheck.Replace(Microsoft.VisualBasic.Left(NumberToCheck, 2), "0")
End If
Dim sql As String = "SELECT a.TelNumber, c.AccountNumber " & _
"FROM TelInfo a " & _
"INNER JOIN Customers b ON a.CustID = b.pkguidId " & _
"INNER JOIN Accounts c ON b.pkguidId = c.CustID " & _
"WHERE a.TelNumber = '" & NumberToCheck & "'"
Using conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=Testing; Persist Security Info=True; " & _
"User Id=JoeSoap; Password=paoseoj;")
Dim cmd As New SqlCommand(sql, conn)
conn.Open()
Dim reader As SqlDataReader = cmd.ExecuteReader
If reader.Read Then
Value = True
AcctNumber = reader(1)
End If
reader.Close()
End Using
На комментариях ниже, сделанные до 08/02/10 (мм/дд/гг):
Value
является только логическая переменная, которая получает, возвращаемые чтобы указать, что найденный номер телефона (NumberToCheck
) существует в базе данных.
Итак ...
Private AcctNumber As String
Dim val As Boolean = False
val = CheckNumber("3235553469")
If val Then
' AcctNumber will have been set by CheckNumber
Label1.Text = AcctNumber
End If
val
будут возвращены только Истина, если NumberToCheck (в данном примере 3235553469) существует в базе данных.
Скопировав значение NumberToCheck в SSMS и проверив там запрос, я могу проверить, что запрос работает должным образом.
Нет, я не могу заполнить DataSet из-за объема информации в таблице (+/- 9.5m строк). Даже с фильтром «WHERE» запрос слишком тяжел для ресурсов и в конечном итоге заканчивается OutOfMemory Exception
, поэтому я пошел с DataReader.
Я собираюсь попробовать опцию ExecuteScalar
, как предлагается в качестве ответа Даррила сейчас, будет обновляться с результатами. изменив If
заявление
If reader.Read() Then
Value = True
AcctNumber = reader(1)
End If
HasRows
экспонатов strange behavior в определенных ситуациях, так что лучше, чтобы избежать его полностью
Можете ли вы показать нам SQL? – egrunin
Я знаю, что ConnectionString в редактировании отличается от оригинала. Мне пришлось изменить определенные вещи для юридических целей ... информация, с которой я работаю, очень чувствительна. –
Строка подключения является наименее вероятной проблемой. – egrunin