2009-12-02 2 views
0

Мне нужно проверить, вернул ли мой оператор SQL любые результаты из базы данных Access, которую я использую для хранения моих данных.Проверка результата SQL в VB.NET

У меня есть этот код атм:

 cn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Computing Project\database.mdb;") 
     cn.Open() 
     cmd = New OleDbCommand("SELECT * FROM(" & roomvar.ToLower() & ") WHERE (((" & roomvar.ToLower() & ".date)=" & Chr(34) & dtpDate.Value.Date & Chr(34) & "))", cn) 
     dr = cmd.ExecuteReader 
      While dr.Read() 

      End While 
     End If 
     dr.Close() 

Я хотел бы быть в состоянии проверить (возможно через логическое значение или что-то), что этот результат возвращаемой запрос. Я использую VB.net.

Благодаря

ответ

1

Простой ответ, я думаю, это:

Dim hasResults as Boolean = false 
    cn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Computing Project\database.mdb;") 
    cn.Open() 
    cmd = New OleDbCommand("SELECT * FROM(" & roomvar.ToLower() & ") WHERE (((" & roomvar.ToLower() & ".date)=" & Chr(34) & dtpDate.Value.Date & Chr(34) & "))", cn) 
    dr = cmd.ExecuteReader 
     While dr.Read() 
      hasResults = true 
     End While 
    End If 
    dr.Close() 

Мой VB-синтаксис немного ржавый, но вы получите идею.
Но я не уверен, что это то, что вы на самом деле хотите.

Другим вариантом может быть

Dim hasResults as Boolean = false 
cn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Computing Project\database.mdb;") 
cn.Open() 
cmd = New OleDbCommand("SELECT 1 FROM(" & roomvar.ToLower() & ") WHERE (((" & roomvar.ToLower() & ".date)=" & Chr(34) & dtpDate.Value.Date & Chr(34) & "))", cn) 
dr = cmd.ExecuteReader 
    If dr.Read() Then 
     hasResults = true 
    End If 
End If 
dr.Close() 
1
Using cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Computing Project\database.mdb;") 
    cn.Open() 
    Using cmd As New OleDbCommand(String.Format("SELECT * FROM({0}) WHERE ((({0}.date)=""{1}""))", roomvar.ToLower(), dtpDate.Value.Date), cn) 
     Using dr As OleDbDataReader = cmd.ExecuteReader() 
      hasResults = dr.Read() 
     End Using 
    End Using 
End Using 

я настоятельно рекомендую вам взглянуть на передавая значение dtpDate в качестве параметра вместо буквального значения в тексте команды, например:

Using cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Computing Project\database.mdb;") 
    cn.Open() 
    Using cmd As New OleDbCommand(String.Format("SELECT * FROM({0}) WHERE ((({0}.date)=?))", roomvar.ToLower()), cn) 
     cmd.Parameters.Add("@dtpDate", OleDbType.Date).Value = dtpDate.Value.Date 
     Using dr As OleDbDataReader = cmd.ExecuteReader() 
      hasResults = dr.Read() 
     End Using 
    End Using 
End Using 
+0

Передача даты в качестве параметра поможет избежать проблем с интернационализацией (т. Е. Работает в неамериканских регионах). И это просто более устойчиво. – MarkJ

4

Просто. Используйте свойство OleDbDataReader.HasRows после вашего вызова ExecuteReader.

cn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Computing Project\database.mdb;") 
    cn.Open() 
    cmd = New OleDbCommand("SELECT * FROM(" & roomvar.ToLower() & ") WHERE (((" & roomvar.ToLower() & ".date)=" & Chr(34) & dtpDate.Value.Date & Chr(34) & "))", cn) 
    dr = cmd.ExecuteReader 

    hasRows = dr.HasRows 

    dr.Close() 
+0

+1 Это единственный ответ, который затронул проблему без перемещения данных. – Wade73