none
SQL funktioniert in Access aber nicht aus VB.NET heraus RRS feed

  • Frage

  • Hallo Leute,

    ich habe ein Projekt, dass mit einer Access-Datenbank versehen ist (Office 2007). Ich möchte gerne folgende Abfrage ausführen:

    SELECT COUNT(rechteid) AS Total FROM tblrechte WHERE rollenid = 3 AND form = 'Form1' AND funktion = 'abbrechenButton';

    Das Witzige ist, dass der SQL-Code direkt in Access ausgeführt wird und ich die erwartete Antwort zurück bekomme.

    Mit:

    Dim conn As New OleDbConnection(connstr)
        Dim strSQL As String = ""
        strSQL = "SELECT COUNT(rechteid) AS Total FROM tblrechte WHERE rollenid = 3 AND form = 'Form1' AND funktion = 'abbrechenButton';"

    Dim cmd As New OleDbCommand(strSQL, conn) cmd.CommandType = CommandType.Text Dim iAnz As Integer = 0 Try conn.Open() iAnz = cmd.ExecuteScalar() bSuccess = True Catch ex As Exception iAnz = 0 bSuccess = False Finally conn.Close() End Try Return iAnz

    funktioniert die Abfrage aber nicht. Egal wieviele Datensätze mit den oben beschriebenen Bedingungen die Tabelle tblrechte enthält, ich bekomme immer 0 zurück. Seht Ihr meinen Fehler? Tausend Dank im Voraus für Eure Hilfe!

    Gruß
    mjanz

    Freitag, 30. Juli 2010 12:14

Antworten

  • In solchen scheinbar undurchsichtigen Fällen mache ich folgendes:
     
    Nach "iAnz = cmd.ExecuteScalar()" rufe ich eine Anzeige auf, um die Daten zuzeigen, z.B. so:
     

      cmd.CommandText = "SELECT * FROM tblrechte WHERE rollenid = 3 AND form = 'Form1' AND funktion = 'abbrechenButton';"
      Dim dt As New DataTable
      Call (New SqlClient.SqlDataAdapter(cmd)).Fill(dt)
      Dim frm As New Form
      frm.Controls.Add(New DataGrid With {.DataSource = dt, .Dock = DockStyle.Fill})
      frm.Show()
    

    --
    Viele Gruesse
    Peter

    Freitag, 30. Juli 2010 14:44

Alle Antworten

  •  
        Catch ex As Exception
          iAnz = 0
          bSuccess = False
      
    Du unterdrückst jegliche Fehlernachricht. Wenn beispielsweise keine ausreichenden Zugriffsrechte vorliegen, wird das nicht erkannt und es werden 0 gelesene Datensätze als Ergebnis geliefert.

    --
    Viele Gruesse
    Peter

    Freitag, 30. Juli 2010 12:38
  • Hallo Peter,

    leider bekomme ich keine Fehlermeldung. Ich habe den Codeblock auskommentiert. Trotzdem ist die Antwort 0. Irgendwie kann ich den Fehler nicht finden. Die Zugriffsrechte habe ich auch. Ich mache noch weitere Abfragen auf die gleiche Tabelle (Selects, Updates, Inserts...) und auch auf andere Tabellen in der Datenbank und da habe ich keine Probleme. Irgendwie ist das wie verhext. Es klappt nicht mit dem SELECT COUNT().

    Trotzdem danke!

    Gruß

    Marcus

    Freitag, 30. Juli 2010 12:48
  • In solchen scheinbar undurchsichtigen Fällen mache ich folgendes:
     
    Nach "iAnz = cmd.ExecuteScalar()" rufe ich eine Anzeige auf, um die Daten zuzeigen, z.B. so:
     

      cmd.CommandText = "SELECT * FROM tblrechte WHERE rollenid = 3 AND form = 'Form1' AND funktion = 'abbrechenButton';"
      Dim dt As New DataTable
      Call (New SqlClient.SqlDataAdapter(cmd)).Fill(dt)
      Dim frm As New Form
      frm.Controls.Add(New DataGrid With {.DataSource = dt, .Dock = DockStyle.Fill})
      frm.Show()
    

    --
    Viele Gruesse
    Peter

    Freitag, 30. Juli 2010 14:44
  • Hallo,

    ich habe ein Projekt, dass mit einer Access-Datenbank versehen
    ist (Office 2007). Ich möchte gerne folgende Abfrage ausführen:

    SELECT COUNT(rechteid) AS Total FROM tblrechte WHERE
    rollenid = 3 AND form = 'Form1' AND funktion = 'abbrechenButton';

    Das Witzige ist, dass der SQL-Code direkt in Access ausgeführt
    wird und ich die erwartete Antwort zurück bekomme.

    Mit:

    [code]
    Dim conn As New OleDbConnection(connstr)

    Wie genau sieht Dein Connectionstring connstr aus?

       Dim strSQL As String = ""
       strSQL = "SELECT COUNT(rechteid) AS Total
       FROM tblrechte WHERE rollenid = 3 AND form = 'Form1'
        AND funktion = 'abbrechenButton';"

    Welches Ergebnis bekommst Du, wenn Du Dein SQL-Statement
    so veränderst:

       strSQL = "SELECT COUNT(*) AS Total
       FROM tblrechte WHERE rollenid = 3 AND form = 'Form1'
        AND funktion = 'abbrechenButton';"

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Freitag, 30. Juli 2010 16:27
  • Hi,

    SELECT COUNT(rechteid) AS Total FROM tblrechte WHERE rollenid = 3 AND form = 'Form1' AND funktion = 'abbrechenButton';

    kannst Du bitte mal den kompletten Try ... Catch ... End Try Kram auskommentieren. Ich hab das so verstanden also ob Du nur den Code innerhalb des Catch Zweigs auskommentiert hast.

    Also so:

    Dim conn As New OleDbConnection(connstr)
      conn.Open()
    
    Dim strSQL As String = ""
      strSQL = "SELECT COUNT(rechteid) AS Total FROM tblrechte WHERE rollenid = 3 AND form = 'Form1' AND funktion = 'abbrechenButton';"
    
    Dim cmd As New OleDbCommand(strSQL, conn)
      cmd.CommandType = CommandType.Text
    
    Dim iAnz As Integer = 0
      iAnz = cmd.ExecuteScalar()
      
      Return iAnz
    
    

    Ich tippe mal auf ein Problem mit dem SQL Statement, "form" und ggfs. auch "funktion" könnten reservierte Worte in Access sein. Probier mal, die als [form] und [funktion] zu schreiben.

    BTW: Du solltest die Objekte auch "disposen" (also <Objekt>.Dispose() aufrufen, wenn es eine solche Methode gibt)

    BTW2: Falls jemand meint, das wäre unnötig: Ist es meist nicht :)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Freitag, 30. Juli 2010 17:48
    Moderator
  • Hallo Leuts,

    entschuldigt, dass ich mich erst jetzt melde, aber ich kam in den letzten Tagen nicht zum programmieren. Über den ersten Tipp von Peter bin ich schlussendlich dem Problem auf die Schliche gekommen. Ich habe eine Klasse geschrieben, mit der ich die meisten Datenbankabfragen, Inserts und so weiter regeln möchte. Diese Klasse kommt vor allem immer dann zum Tragen, wenn ich LINQ nicht verwenden kann. Ich hatte etwas Neues ausprobiert und hatte einen klitzekleinen Denkfehler versteckt...

    Ansonsten tausend Dank für Eure Hilfe!

    Gruß

    Marcus

    Sonntag, 8. August 2010 11:43