Zum Inhalt springen

CString zu wenig Platz


Patrick.Karre

Empfohlene Beiträge

Also, ich wüsste jetzt nicht wo mein Fehler liegen könnten, aber nachfolgend findest Du den Code:


CString strMSSQLStatement;

strMSSQLStatement.Format(_T("SET ANSI_WARNINGS OFF; ")

_T(" INSERT INTO [%s_%s] ")

_T(" ( ")

_T(" IdAddress, IdUserCreate, TimeCreate, OP_SeminarVon, OP_SeminarBis, OP_Seminarname, ")

_T(" OP_Bestellnummer, OP_Verpflegung, OP_LaufendeNummer, OP_AngenommenVon, OP_AngenommenVonName ")

_T(" ) ")

_T(" VALUES ")

_T(" (%d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, %d, '%s'); ")

_T(" SET ANSI_WARNINGS ON; ")

, CString(GetVIPSQLTableName(VIPTBL_KUNDEN, 1))

, CString(GetVIPSQLTableName(VIPTBL_EX_KUNDEN_SEMINARBEWEGUNG, 2))

, lAddressId

, 1

, szDate

, dlg.m_strSeminarFrom.GetString()

, dlg.m_strSeminarTo.GetString()

, dlg.m_strSeminarName.GetString()

, dlg.m_strSeminarName.GetString()

, atol(dlg.m_strSeminarVerpflegung.GetString())

, dlg.m_lSerialNumber

, lUserId

, strUserName.GetString());

Vielleicht siehst Du ja den Fehler ;-(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wird der String ab einer bestimmten Länge abgeschnitten, oder ab einem bestimmten Feld?

Der Fehler muss übrigens nicht dort stecken, wo er sich bemerkbar macht. Es kann sein, dass du schon vorher den Speicher der Strings durcheinanderbringst, z.B. durch einen Aufruf von GetBuffer ohne nachfolgenden Aufruf von ReleaseBuffer.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der String wird nach einer bestimmte Länge abgeschnitten, das habe ich schon getestet.
Wie stellst du die Länge fest? Und welche Länge ist das?

Der Aufruf ist wie Du ihn sieht, ich rufe keine anderen Funktionen vorweg auf.

Du meinst, du benutzt vorher im gesamten Programm keine Methoden von CString? Das glaube ich nicht ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

ICh verwende zwar CString, aber genau so, wie Du ihn sieht.
Du benutzt also nur CString::Format? Nirgendwo GetBuffer oder LockBuffer oder ein Cast auf einen nicht-const-Zeiger?

Kannst du ein Minimalbeispiel erstellen, das den Fehler reproduziert?

Wie kann ich den Buffer erhöhen? Was müsste ich machen?
Gar nichts, das muss von ganz allein funktionieren. Wenn nicht, hast du mit an Sicherheit grenzender Wahrscheinlichkeit einen Fehler in deinem Code.

Und nochmal die Frage: Wie stellst du die Länge fest, und bei welcher Länge wird abgeschnitten?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann es sein, dass der Fehler darin besteht, dass ich %s mit einem CString fülle?
Nicht, solange du das nur mit CString::Format machst (und nicht etwa mit sprintf).

Allerdings darfst du das CString-Objekt, dessen Format-Methode du aufrufst, nicht als Parameter im selben Aufruf benutzen.

Möchtest du eigentlich meine Fragen nicht beantworten?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh sorry, die Länge habe ich gestest indem ich einen kürzeren und längeren Text eingelesen habe, es wurde immer nur die gleiche Anzahl an Zeichen dargestellt.

Ich rufe folgende Befehle aus:

FORMAT

GETSTRING

ALLOCSYSSTRING

Weitere Befehler rufe ich nciht aus, ein Beispiel kann ich leider auf die schnelle nciht fertig machen und die Codes darf ich nciht rausgeben, sorry.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh sorry, die Länge habe ich gestest indem ich einen kürzeren und längeren Text eingelesen habe, es wurde immer nur die gleiche Anzahl an Zeichen dargestellt.
Wo wurde denn dargestellt? Ich will nur sicherstellen, dass es nicht die Darstellung ist, die eine Begrenzung hat. Hast du dir die Länge mit GetLength ausgeben lassen?

Und welche Länge ist es nun?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe mir die Länge jetzt direkt mit GETLENGHT zurück geben lassen und habe ein sehr interessantes Ergebnis. Je nachdem wieviele Zeichen ich am Anfang ergänze oder kürze verändert sich die Länge.

Einmal 462 dann 506 dann 536.

Es muss was mit der Formatierung zu tun haben, oder sehe ich das Falsch?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, ich übergabe nur LONG und CString Felder.

Ich habe noch einmal getestet ab wann genau abgeschnitten wird, leider variaert das noch wenn in den CSTRINGS längere und kürzere Texte vorhanden sind, daher ist es nicht möglich zu sagen, bei welchen Feld abgeschnitten wird. Es scheint aber an folgenden zu liegen:


, dlg.m_strSeminarName.GetString()

, atol(dlg.m_strSeminarVerpflegung.GetString())

, dlg.m_strSeminarName.GetString() 

, lUserId

, strUserName.GetString()

Es wurde mir gesagt, es könnt daran liegen, dass ich CSTRING in einen CSTRING eintragen möchte. Leider finde ich nicht im Internet was diese theorie bestätigen könnte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe ich mir mittlerweile auch gedacht, ich da in dem Programm bereits ca. 40 SQL-Statements genau so aufgebaut werden. Diese sind nur alle relativ kurz, daher gabes bisher keine Probleme.

Hier findest Du die komplette Funktion:


BSTR CKMPokoVIPSQLAddInCtrl::GetVIPSQLTableName(LPCTSTR bstrTableName, INT iTableType)

{

	CLSDatabase Database;

	CTable Table;


	CString strName, strTable, strTabelName, strSQLQuery;


	switch(iTableType)

	{

	case 1:

		strName		= "tblAS0000";

		strTable	= "tblMasterAddrSets";

		break;


	case 2:

		strName		= "EX0000";

		strTable	= "tblMasterRelations";

		break;


	case 3:

		strName		= "PJ0000";

		strTable	= "tblMasterProjects";

		break;

	}


	if (Database.Open(&m_strMSSQLUser, &m_strMSSQLPassword, &m_strMSSQLConnectionString))

	{

		CString strMSSQLStatement;

		strMSSQLStatement.Format(_T("SELECT [T1].[Id]")

								 _T("FROM [%s] AS [T1] ")

								 _T("WHERE [Name]='%s' ")

								 , strTable.GetString()

								 , bstrTableName);


		if (Database.Execute(&strMSSQLStatement, Table))

		{

			if (Table.ISEOF() == false)

			{

				Table.MoveFirst();


				strTabelName = Table.Get("Id");

				strTabelName = strName.Left(strName.GetLength() - strTabelName.GetLength()) + strTabelName;

			}

		}

	}


	return strTabelName.AllocSysString();

}

Hintergrund der Funktion ist, die Datenbank die angesteuert wird, ist durch Mastertabellen komplett dynamisch. Der Benutzer kann die internen Tabellennamen nciht kennen. Die Funktion liesst die internen Namen aus. Dadurch können die Codes auch auf andere Systeme portiert werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum ist der Rückgabetyp BSTR?

Ist dir klar, dass du mit AllocSysString ein Speicherleck hast? Rohe BSTRs erfordern explizites Speichermanagement.

"LPCTSTR bstrTableName" ist auch nicht so toll. Wenn du schon UN benutzt, sollten die Namen auch zu den Typen konsistent sein.

Wirfst du auch noch an anderer Stelle im Code so mit BSTRs um dich? Das könnte deine Heapprobleme erklären.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...