großes Char-Array ausnutzen



  • Hallo liebe Community,

    ich hab ein seltsames Problem. Und zwar hab ich ein Script, was ich an eine MSSQL Datenbank übergeben will.

    Erst hab ich es mit einem String probiert, welcher jedoch ab einer bestimmten Zeichenanzahl endet. Also bin ich auf ein char-Array umgestiegen. Das endet jedoch komischer Weise nach 473 Zeichen...hat da jemand eventuell eine Idee, was ich wieder mal falsch mache?

    Hier der Code:

    char strSQL2[1000] = "if object_id('dbo.fn_SQLServerDataDir') is not null drop function dbo.fn_SQLServerDataDir";
    records = myDB->connection->Execute(strSQL2, NULL, ADODB::adExecuteNoRecords); 
    
    strcpy(strSQL2, "create function dbo.fn_SQLServerDataDir() returns nvarchar(4000) as");
    
    strcat(strSQL2, " begin declare @rc int, @dir nvarchar(4000) exec @rc = master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\MSSQLServer',N'DefaultData', @dir output, 'no_output' if (@dir is null)");
    
    strcat(strSQL2, " begin exec @rc = master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\Setup',N'SQLDataRoot', @dir output, 'no_output' select @dir = @dir + N'\Data' end return @dir end");
    
    cout << strlen(strSQL2);
    

    Folgender String steht laut Debugger im Array.

    create function dbo.fn_SQLServerDataDir() returns nvarchar(4000) as begin declare @rc int, @dir nvarchar(4000) exec @rc = master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',N'SoftwareMicrosoftMSSQLServerMSSQLServer',N'DefaultData', @dir output, 'no_output' if (@dir is null) begin exec @rc = master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',N'SoftwareMicrosoftMSSQLServerSetup',N'S
    

    Und an dieser Stelle endet der char.

    Ich bin für jede Hilfe dankbar.

    LG,
    Ronny



  • Hallo,

    die Zeichenkette ist noch dazu völlig kaputt. Ist dir der Begriff Escape-Sequenzen überhaupt nicht bekannt?:

    http://msdn.microsoft.com/en-us/library/h21280bw(VS.80).aspx

    Ansonsten wäre es möglich, dass der Debugger nicht die ganze Zeichenkette anzeigt, darauf sollte man sich also nicht verlassen. Besser eine Testausgabe:

    /* weil wir hier im ANSI-C-Forum sind */
    puts(strSQL2);
    

    MfG,

    Probe-Nutzer



  • Der '\' in einem String leitet ein besonderes Escape-Zeichen ein. Wenn Du den '\' selbst in einem String haben willst, mußt Du ihn immer so:
    "...\..." angeben.
    Also in Deinem Beispiel: "...Software\\Microsoft\\MSSQLServer\\Setup...":
    Auf diese Weise bekommst Du bei Bedarf zB auch ein " in den String:
    "...\"...".



  • "...\"..."
    meinte ich natürlich ...



  • Tja, keine Ahnung, was da schief geht, in der Vorschau sieht es gut aus, wenn ich jetzt hier während des Edit-Vorgangs nach unten scrolle, sieht es auch gut aus?!
    Was ich sagen wollte ist, wenn Du die doppelten Anführungszeichen in einem String haben willst, mußt Du ihnen auch den Backslash voranstellen, daran erkennt der Compiler, daß Du damit nicht das Ende der Zeichenkette kennzeichnen willst.



  • Oh man, Asche auf mein Haupt.

    Manchmal könnt ich mich selbst ohrfeigen. Ist eigentlich völlig logisch, dass es an der Escape-Sequence liegt.

    Trotzdem vielen Dank für den Hinweis...manchmal sieht man den Wald vor lauter Bäumen nicht. 😞

    LG,
    Ronny


Anmelden zum Antworten