Announcement

Collapse
No announcement yet.

Rückgabewert von ALTER INDEX REORGANIZE

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Rückgabewert von ALTER INDEX REORGANIZE

    Wenn ich unter C# mit
    Code:
    ExecuteNonQuery
    Code:
    ALTER INDEX REORGANIZE
    aufrufe (mit Option ALL), erhalte ich als Rückgabewert -1. Sollte das nicht die betroffenen Zeilen zurückgeben oder geht das bei Indizes nicht, was bedeutet das -1? Kann es sein dass es nichts zu reorganisieren gibt da die Tabelle zu wenig Einträge und erst recht Änderungen enthält?

    Vielen Dank!

  • #2
    Hallo C.M.Obrecht,

    wenn Du den Befehl in SSMS ausführst, bekommst Du auch nur die Meldung "Befehl(e) wurde(n) erfolgreich abgeschlossen.", egal wieviele Indizes es gab oder wieviel da reorganisiert wurden.
    Enstprechend gibt es auch nichts, das Dir Ado.Net zurückmelden könnte.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Prima! Vielen Dank.
      Heisst -1 denn Erfolg? Beim Backup kommt auch -1.

      Apro pos Backup, was muss ich angeben dass ein Restore durchgeführt werden kann; es erscheint immer die Datenbank sei vorhanden/benutzt und könne darum nicht wiederhergestellt werden. Dass das nicht passiert wäre ja der Sinn der Funktion, sonst kann ich ja gleich .mdf und log kopieren.....

      Comment


      • #4
        Heisst -1 denn Erfolg?
        Gute Frage; laut MSDN Doku sollte +1 bei raus kommen, -1 ist nicht wirklich dokumentiert.
        Schlägt es fehl, gibt es eine SqlExecption, von daher war es erfolgreich.

        die Datenbank sei vorhanden/benutzt
        Die Meldung wird lauten "in Benutzung".
        Während einer Rücksicherung darf niemand an der Datenbank angemeldet sein, auch nicht der Prozess, der die Rücksicherung auslöst.
        Ich nehme an, das Du das Restore auch per SQL Command auslöst?
        Dann führe vorher das Statement
        "USE [master]"
        aus, damit auch sicher die aktuelle Connection nicht auf der Datenbank ist, die rückgesichert werden soll.
        Hinterher kannst Du ja wieder auf die gleiche Weise zurück switchen.
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Super, vielen Dank!

          Ja restore sieht so aus:
          Code:
          openFileDialog1.Filter = "BAK-Dateien (*.bak)|*.bak|Alle Dateien (*.*)|*.*";
                      openFileDialog1.FileName = " ";
                      
                      if (openFileDialog1.ShowDialog() == DialogResult.OK)
                      {
                          System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(Properties.Settings.Default.DVDsDBConnectionString);
                          try
                          {
                              conn.Open();
                              String dbPath = Application.StartupPath + "\\DVDsDB.mdf";
                              System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand("USE [MASTER] RESTORE DATABASE [" + dbPath + "] FROM DISK = \'" + openFileDialog1.FileName + "\' WITH NORECOVERY", conn);
                              int res1 = com.ExecuteNonQuery();
          
          
                              MessageBox.Show("Wiederherstellungsvorgang abgeschlossen. Meldung der Datenbank: " + res1.ToString());
                              System.Data.SqlClient.SqlCommand com2 = new System.Data.SqlClient.SqlCommand("USE [dbo]", conn);
                              com2.ExecuteNonQuery();
                          }
                          catch (Exception ex)
                          {
                              MessageBox.Show("Fehler beim Wiederherstellen! : " + ex.Message + "\n" + ex.InnerException, "Achtung! Fehler beim Wiederherstellen", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                          }
                          finally
                          {
                              conn.Close();
          
                          }
                      }
          habe nun das "USE [dbo]" hinzugefügt da ich nun nicht mehr auf die Datenbank zugreifen kann; habe den Anwendungsordner zum testen auf den Desktop kopiert und nun funktioniert das Programm überall, nur nicht wenn es in einem Ordner auf dem Desktop liegt. WIe bekomme ich das richtig hin? Versuchte auch im Management Studio "USE [D:\Dokumente.....] einzugeben, wurde erfolgreich ausgeführt aber half nichts... Wie lautet da der richtige Befehl?

          Comment


          • #6
            USE [MASTER]
            heisst, das im aktuellen Kontext auf die Systemdatenbank "master" als aktuelle DB umgestellt wird; macht man, weil jeder User zumindest sich an die master anmelden darf; unabhängig davon, was er sonst noch darf; ist damit völlig unkritisch, da kann kein Fehler bei entstehen.

            dbo ist ein Schema (Database Owner), das geht nicht mit dem USE Befehl; man kann da nur einen Datenbanknamen angeben.
            Ich weiß nicht, ob das so ohne weiteres geht, das USE in einem Statement mit anderen Kommandos anzugeben, noch nicht ausprobiert.
            Entweder in separaten COMMANDs angeben oder zumindest eine Semikolon im Anschluß, also
            ("USE [MASTER]; RESTORE DATABASE ["
            wie in C# sozusagen

            Übrigens, in C 4fach+ (C#) kann man
            Using System.Data.SqlClient
            oben in einer Klasse angeben, dann musst Du es nicht immer explizit dazu schreiben; dadurch wird es besser lesbar.
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #7
              AHaa ja, ich habe nun angegeben:
              Code:
              String dbPath = Application.StartupPath + "\\DVDsDB.mdf";
                          System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(Properties.Settings.Default.DVDsDBConnectionString);
                              
                          System.Data.SqlClient.SqlCommand com2 = new System.Data.SqlClient.SqlCommand("USE [" + dbPath + "]", conn);
                          com2.ExecuteNonQuery();
              aber das hilft nichts; der Befehl funktionierte anscheinend schon ohne das ; er bewirkte ja dass ich das Projekt im Release nun nicht mehr starten kann Was mache ich nun?

              Comment


              • #8
                Bei USE gibt man den Datenbanknamen an, nicht den Datenbankdateinamen (+.mdf).
                Sieh mal in dem ConnectionString nach, da wird "Initial Catalog=" drin stehen; was danach kommt ist der Datenbankname.
                Oder betreibst Du es als User Instance? Dann wird sie DVDsDB heissen
                => USE [DVDsDB]
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  USE [DVDsDB] half nicht aber Initial Catalog habe ich nicht, es ist User Instance. der Connectionstring sieht so aus: Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DVDsDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True

                  Comment


                  • #10
                    Habe bisher noch nicht mit einer User Instance gearbeitet.
                    Wenn ich mir das hier
                    http://msdn.microsoft.com/en-us/libr...4(SQL.90).aspx
                    durchlese, ist doch der vollständige Dateiname zugleich der Datenbankname und dort wird auch USE verwendet
                    use [C:\MYDBPROJECTS\TESTVB1\TESTVB1\DATABASE1.MDF]
                    Olaf Helper

                    <Blog> <Xing>
                    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                    Comment


                    • #11
                      Muss ich nochmals versuchen wenn ich wieder zu Hause bin; aber ich glaube das Problem ist dass ich den Befehl mit dem Connection string gar nicht absenden kann da gar keine Anmeldung erfolgreich ist; müsste ja fast einen anderen Connection String nehmen...

                      Comment


                      • #12
                        Wenn Du mit USE auf die "master" kommst, dann solltest Du auch genau so auf Deine DB zuückkommen.
                        Aber wie gesagt, noch habe ich keine User Instance verwendet.
                        Olaf Helper

                        <Blog> <Xing>
                        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                        Comment


                        • #13
                          Irgendwie nicht so ganz; das Wiederherstellen klappte aber das Zurückschalten war zu früh. Da beendete sich das Programm und dann konnte ich wieder keine Verbindung herstellen; auch nicht beim Laden des Formulars den USE-Befehl absetzen.
                          Ist mir etwas zu heiss sowas, gibt es denn da keine andere Möglichkeit die Datenbank zu sichern? Die mdf und ldf-Dateien sind an sich nicht blockiert wenn das Programm nicht läuft; müsste sie nur vom Programm aus trennen können, kopieren und wieder verbinden... wäre wohl fast einfacher und sicherer...
                          Die User Instance ist ja eigentlich das sinnvollste bei einem Projekt welches mit einem Setup ink. DB verteilt werden soll...

                          Comment

                          Working...
                          X