2010-07-29 2 views
1

Это невероятно срочно, мне нужно представить это приложение за 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 в определенных ситуациях, так что лучше, чтобы избежать его полностью

+0

Можете ли вы показать нам SQL? – egrunin

+0

Я знаю, что ConnectionString в редактировании отличается от оригинала. Мне пришлось изменить определенные вещи для юридических целей ... информация, с которой я работаю, очень чувствительна. –

+0

Строка подключения является наименее вероятной проблемой. – egrunin

ответ

0

В бессмертных словах Гомера Симпсона ... «DOH !!»

Я только что посмотрел базу данных, что мое приложение ищет номера телефонов, и я не знаю, как я мог пропустить его, но ценность, которую я ищу, на самом деле там.

Проблема, поэтому, скорее всего, не иметь ничего общего с моим кодом, а данные ...

3

Try.

+0

+1 - это в основном нарушение, потому что читатель не был перемещен в первую строку. –

+0

Хорошее предложение, но не улучшение –

+0

@Logan Убедитесь, что вы используете правильный 'sql' и выдаете это утверждение в отношении правильной базы данных - здесь нет ничего плохого. –

0

Просто убедитесь, что это не проблема с данными, параметризуйте свой SQL.Исправьте оператор:

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 = @telNumber" 

Тогда это сделать:

Dim cmd As New SqlCommand(sql, conn) 
cmd.Parameters.AddWithValue("@telNumber", NumberToCheck) ' <==== added line 

Редактировать

Я думаю, что мы ищем в неправильном месте. Добавьте это как раз перед if reader.Read():

Value = false 
AcctNumber = "" 

Это позволит убедиться, что вы не возникли проблемы с переменной областью действия. (Вы :, используя Option Strict On, справа?)

+0

Я сделал, проверьте редактирование на моем OP –

+0

Возможно, у нас проблема с перекрытием-редактированием, ваш код по-прежнему выглядит как '' '' & NumberToCheck & "'" '...? – egrunin

+0

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

1

Это не решит проблему, но может помочь вам ознакомить вас с вашей презентацией. Используйте «ExecuteScalar», который должен работать, когда вы возвращаете одно значение.

AcctNumber = "" 
    AcctNumber = cmd.ExecuteScalar 
    If AcctNumber = "" Then 
     Value = False 
    Else 
     Value = True 
    End If 
Смежные вопросы