Announcement

Collapse
No announcement yet.

Zeitplan für CSV-Export über C++

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

  • Zeitplan für CSV-Export über C++

    Ich möchte eine SQL Abfrage schreiben, die eine SELECT Abfrage über einen Zeitplan ausführt und ihr Ergebnis in einer CSV Datei speichert. Ich habe bereits die folgende Abfrage:
    Code:
    -- CSV-Datei mit dem Semikolon als Spaltentrennzeichen erzeugen
    DECLARE @sql VARCHAR(4000)
    SELECT @sql = 'bcp "SELECT * FROM Datenbank.dbo.Tabelle" queryout C:\CsvExport.csv -c -t; -T -S'+ @@servername
    EXEC master..xp_cmdshell @sql
    GO
    Das Problem ist nun, dass ich den Zeitplan automatisch über ein C++ Programm hinzufügen will, ich kann also nicht die SQL Server Oberfläche dafür benutzen. Wie geht das am besten?

    Anmerkung: Ich benutze C++ Builder (ADO-Elemente) und MS SQL Server.

  • #2
    Ich habe jedenfalls nicht verstanden, was heisst

    den Zeitplan automatisch über ein C++ Programm hinzufügen will,
    Geht es um das SQL-Statement; dieses über eine TADOQuery ausführen lassen.
    Christian

    Comment


    • #3
      Naja, ich hatte gehofft dass man über SQL nen Insert oder so machen kann was den Zeitplan hinzufügt.

      Also ich weiß schon wie man SQL Statements mit ADO ausführt ich weiß nur nicht, ob man ein SQL Statement schreiben kann was einen Zeitplan hinzufügt oder wie die Syntax dafür ist.

      Also wenn man nen Zeitplan auch anders über ADO erzeugen kann ohne SQL Statement wäre mir das auch recht.

      Comment


      • #4
        Selbstverständlich kann man einen INSERT per SQL machen.....

        Aber tut mir leid, ich verstehe das Problem überhaupt nicht. Im ersten Posting willst du ja mittels SQL eine Datei erzeugen. Ok. dann sollte mit TADOQuery analog gehen. Im zweiten Posting willst du einen Zeitplan hinzufügen???
        Christian

        Comment


        • #5
          Die Datei kann ich schon erzeugen (siehe Codezitat), ich weiß nur nicht, wie ich das als Zeitplan mache.

          Also ich hab ne Query, und jetzt will ich sie z.B. jeden Tag einmal ausführen, ohne dass das Programm weiterlaufen muss.

          Hab ich doch auch in der ersten Post schon geschrieben, dass das Problem der Zeitplan ist.
          Zuletzt editiert von Rya; 14.02.2008, 16:18.

          Comment


          • #6

            Also ich hab ne Query, und jetzt will ich sie z.B. jeden Tag einmal ausführen, ohne dass das Programm weiterlaufen muss
            Wie soll das gehen?? Irgendein Programm wird wohl aktiv sein müssen

            Davon ausgehend das du mit "Zeitplan" das zeitgesteuerte abarbeiten eines Programmes zu einem bestimmten Zeitpunkt meinst (und nicht irgendeine Tabelle die so heisst oder anderes Teil aus deinem Programm), steht hierfür der Taskplaner zur Verfügung. Eine Weitere Methode wäre, ein Programm mit dem SQL in den Autostart zu legen, und es dann beim Rechnerstart ausführen zu lassen. Weiter wäre zu prüfen, ob deine DB selber solche zeitgesteuerten Prozeduren unterstützt.
            Christian

            Comment


            • #7
              Naja am besten ist es wenn es über die Datenbank läuft, soll ich das eher in der Datenbanksektion fragen?

              Hatte ja nur gedacht, dass es vielleicht ne Methode gibt sagen wir mal "AddSchedule" mit der ich automatisch so einen Task für eine SQL Abfrage erzeugen kann, der immer regelmäßig ausgeführt wird.


              Okay ich habe jetzt die Syntax um den Zeitplan zu erstellen:
              Code:
              USE [msdb]
              GO
              /****** Objekt:  Job [Zeitplan-Export]    Skriptdatum: 02/15/2008 10:02:32 ******/
              BEGIN TRANSACTION
              DECLARE @ReturnCode INT
              SELECT @ReturnCode = 0
              /****** Objekt:  JobCategory [[Uncategorized (Local)]]]    Skriptdatum: 02/15/2008 10:02:32 ******/
              IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
              BEGIN
              EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
              IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
              
              END
              
              DECLARE @jobId BINARY(16)
              EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Zeitplan-Export', 
              		@enabled=1, 
              		@notify_level_eventlog=0, 
              		@notify_level_email=0, 
              		@notify_level_netsend=0, 
              		@notify_level_page=0, 
              		@delete_level=0, 
              		@description=N'Speichert alle 5 Minuten die Tabelle PatientMeasurementResults in C:\CsvExport.csv', 
              		@category_name=N'[Uncategorized (Local)]', 
              		@owner_login_name=N'sa', @job_id = @jobId OUTPUT
              IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
              /****** Objekt:  Step [CSV-Export]    Skriptdatum: 02/15/2008 10:02:32 ******/
              EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'CSV-Export', 
              		@step_id=1, 
              		@cmdexec_success_code=0, 
              		@on_success_action=1, 
              		@on_success_step_id=0, 
              		@on_fail_action=2, 
              		@on_fail_step_id=0, 
              		@retry_attempts=0, 
              		@retry_interval=0, 
              		@os_run_priority=0, @subsystem=N'TSQL', 
              		@command=N'-- CSV-Datei mit dem Semikolon als Spaltentrennzeichen erzeugen
              DECLARE @sql VARCHAR(4000)
              SELECT @sql = ''bcp "SELECT * FROM PCC_Benjamin.dbo.PatientMeasurementResults" queryout C:\CsvExport.csv -c -t; -T -S''+ @@servername
              EXEC master..xp_cmdshell @sql
              GO ', 
              		@database_name=N'PCC_Benjamin', 
              		@flags=0
              IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
              EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
              IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
              EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Test-Zeitplan', 
              		@enabled=1, 
              		@freq_type=4, 
              		@freq_interval=1, 
              		@freq_subday_type=4, 
              		@freq_subday_interval=1, 
              		@freq_relative_interval=0, 
              		@freq_recurrence_factor=0, 
              		@active_start_date=20080215, 
              		@active_end_date=20080216, 
              		@active_start_time=0, 
              		@active_end_time=235959
              IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
              EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
              IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
              COMMIT TRANSACTION
              GOTO EndSave
              QuitWithRollback:
                  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
              EndSave:
              Wenn ich sie direkt über die Datenbank ausführe funktioniert sie einwandfrei, wenn ich sie allerdings über TADOQuery ausführe wird die Exception "Die gespeicherte Prozedur ypÜ konnte nicht gefunden werden" geworfen. Irgendeine Idee woran das liegt?
              Zuletzt editiert von Rya; 15.02.2008, 11:29.

              Comment


              • #8
                Okay ich konnte das seltsame Problem lösen (die SQL Datei hat anscheinend böse versteckte Zeichen gehabt), allerdings habe ich jetzt ein Neues.

                Wenn ich die oben genannte SQL Syntax ausführen will über den C++ Builder, dann kommt nun folgende Exception:
                "Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben."

                Die gleiche Syntax funktioniert über den Datenbankmanager weiterhin fehlerfrei.

                Edit: Okay hab's gelöst. Anscheinend sind einige Befehle wie GOTO und TRANSACTION nicht so beliebt. Nachdem ich die entsprechenden Zeilen entfernt hatte, ging es.
                Zuletzt editiert von Rya; 18.02.2008, 15:39.

                Comment


                • #9
                  Es gibt hier keine Sammelthreads:

                  Je Problem ein Thread bitte!
                  Christian

                  Comment


                  • #10
                    Ist ja noch das gleiche Problem und zwar einen Zeitplan für nen CSV Export über C++ erzeugen.

                    Comment

                    Working...
                    X