Datentyp CStringW



  • Ich bin gerade dabei mein Programm an eine Datenbank (MS SQL Express 2005) anzubinden. Beim Erzeugen des Recordsets bin ich jetzt über den Datentyp CStringW für das Handling mit Zeichenketten aus der Datenbank gestoßen. Der ist ja nun für die Behandlung von Unicode gedacht. Jetzt hab ich allerdings überall wo die DoDataExchange/DoFieldExchange ausgeführt wird Probleme, da der Compiler meint keine Überladung der DDX/RFX-Funktionen zu finden. Kann man das einfach casten?


  • Mod

    Nein kannst Du nicht! Die DDXRoutinen verwenden immer nur CString!

    Wie soll das auch gehen. Komplett Unicode in MBCS darstelllen geht nicht bzw. nur eingeschränkt.

    Evtl. ist es einfacher Dein gesamtes Projekt auf Unicode umzustellen. Das kann aber viel Nacharbeit fordern, wenn Du unsauber gearbeitet hast und nicht konsquent die T-Notation/TCHAR verwendet hast.



  • Martin Richter schrieb:

    Nein kannst Du nicht! Die DDXRoutinen verwenden immer nur CString!

    Einspruch, Euer Ehren. 🙂 (ok, sind keine DDX sondern RFX)

    Andy, meinst Du diese Funktionen?

    void AFXAPI RFX_Text(CFieldExchange* pFX, LPCTSTR szName, CStringW &value, int nMaxLength, int nColumnType, short nScale)
    {
    	nsRFX_Text::RFX_Text(pFX, szName, value, nMaxLength, nColumnType, nScale, SQL_C_WCHAR, L' ');
    }
    
    void AFXAPI RFX_Text(CFieldExchange* pFX, LPCTSTR szName, CStringA &value, int nMaxLength, int nColumnType, short nScale)
    {
    	nsRFX_Text::RFX_Text(pFX, szName, value, nMaxLength, nColumnType, nScale, SQL_C_CHAR, ' ');
    }
    

  • Mod

    Stattgegegeben! 🕶

    Dann muss ich meine Aussage präzisieren:
    Gegen RFX habe ich auch nichts gesagt. 😉 Dann mag er per RFX binden.
    Aber ein DDX bindet immer nur CString, eben gemäß der Einstellung des Projektes.
    Was nützt ihm aber ein Unicode CStringW aus der DB, denn er dann per CStringA an ein Fenster überträgt?



  • Ja ich glaube das Problem tritt nur bei DDX auf.

    Martin Richter schrieb:

    Stattgegegeben! 🕶

    Dann muss ich meine Aussage präzisieren:
    Gegen RFX habe ich auch nichts gesagt. 😉 Dann mag er per RFX binden.
    Aber ein DDX bindet immer nur CString, eben gemäß der Einstellung des Projektes.
    Was nützt ihm aber ein Unicode CStringW aus der DB, denn er dann per CStringA an ein Fenster überträgt?

    Genau das war ja meine Frage? Ich hab Editfelder, deren Inhalt an die DB weiter gegeben werden. In der MS-SQL-Datenbank haben die den Datentyp nvarchar[50]. Dazu hab ich mir eine ODBC-Consumer-Klasse erstellt und da hat der Assistent diese Variablen reingeworfen. Könnte jetzt sein das es am Datentyp der DB liegt, denn der ist ja unicodefähig. Ich könnte jetzt einhergehen und die Editfelder mit CStringW-Variablen belegen, dann funktioniert aber das DDX nicht.

    Martin Richter schrieb:

    Nein kannst Du nicht! Die DDXRoutinen verwenden immer nur CString!

    Wie soll das auch gehen. Komplett Unicode in MBCS darstelllen geht nicht bzw. nur eingeschränkt.

    Evtl. ist es einfacher Dein gesamtes Projekt auf Unicode umzustellen. Das kann aber viel Nacharbeit fordern, wenn Du unsauber gearbeitet hast und nicht konsquent die T-Notation/TCHAR verwendet hast.

    Ich denke das ich da sauber gearbeitet habe, denn ich hab überall bei den von mir verwendeten Strings die T-Natation dastehen. Problem sind wie gesagt die Editfelder. Warum sind denn die DDX-Funktionen nicht unicodefähig?
    Leider hab ich da auch eine dll bekommen wo ich nicht weiß, wie da intern die Strings gehandelt werden. Da gehts bunt durcheinander. Nur die Quelle, von der ich diese DLL hab, ist leider nicht mehr auf dem Markt.
    Weiterhin hanb ich da noch ein Modul welches mit char-Arrays arbeitet (RS-232) und die sind auch nicht unicodefähig.
    Jetzt ist die Frage was ich am gescheitesten mache.



  • Bringe doch bitte mal ein Beispiel mit genauer Fehlermeldung.



  • Wenn man die Zielvariablen des Dialogs auf CStringW setzt macht die DDX_Text die Probleme.

    d:\Programmierung\Passwort_DB\NewUser.cpp(38) : error C2665: 'DDX_Text': Durch keine der 17 Überladungen kann Parameter 3 vom Typ 'CStringW' konvertiert werden
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(32): kann 'void DDX_Text(CDataExchange *,int,BYTE &)' sein
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(33): oder       'void DDX_Text(CDataExchange *,int,short &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(34): oder       'void DDX_Text(CDataExchange *,int,int &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(35): oder       'void DDX_Text(CDataExchange *,int,UINT &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(36): oder       'void DDX_Text(CDataExchange *,int,long &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(37): oder       'void DDX_Text(CDataExchange *,int,DWORD &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(38): oder       'void DDX_Text(CDataExchange *,int,LONGLONG &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(39): oder       'void DDX_Text(CDataExchange *,int,ULONGLONG &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(40): oder       'void DDX_Text(CDataExchange *,int,CString &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(42): oder       'void DDX_Text(CDataExchange *,int,float &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(43): oder       'void DDX_Text(CDataExchange *,int,double &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(44): oder       'void DDX_Text(CDataExchange *,int,COleCurrency &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(45): oder       'void DDX_Text(CDataExchange *,int,ATL::COleDateTime &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(46): oder       'void DDX_Text(CDataExchange *,int,GUID &)'
            c:
    \Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(47): oder       'void DDX_Text(CDataExchange *,int,DECIMAL &)'
            c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxdd_.h(48): oder       'void DDX_Text(CDataExchange *,int,FILETIME &)'
            bei Anpassung der Argumentliste '(CDataExchange *, int, CStringW)'
    

  • Mod

    Ist doch logisch. MBC kann kein CStringW... Das habe ich doch schon erklärt oder?



  • Und welche Fehlermeldungen gibt es, wenn man die Variable auf CString setzt?


  • Mod

    sri schrieb:

    Und welche Fehlermeldungen gibt es, wenn man die Variable auf CString setzt?

    Er möchte doch die Datenbank Felder mt CStringW binden.

    Das ganze Dilemma kann er nur lösen, wenn er das Projekt komplett auf Unicode umstellt. Es geht auch anders, aber dann kann er in der Applikation die Unicode Zeichen aus der Datenbank evtl. nicht darstellen.



  • Ja das war schon geklärt, er wollte es ja nur noch mal sehen.

    Martin Richter schrieb:

    sri schrieb:

    Und welche Fehlermeldungen gibt es, wenn man die Variable auf CString setzt?

    Er möchte doch die Datenbank Felder mt CStringW binden.

    Das ganze Dilemma kann er nur lösen, wenn er das Projekt komplett auf Unicode umstellt. Es geht auch anders, aber dann kann er in der Applikation die Unicode Zeichen aus der Datenbank evtl. nicht darstellen.

    Dann werde ich wohl umstellen müssen. Sehe ich das richtig das man da in den Projekteinstellungen den Zeichensatz von Multibyte auf Unicode umstellt? Was wird aber dann mit den DDX-Funktionen? Da ändert sich doch nichts...


  • Mod

    Aus CString wird dann CStringW, damit geht alles andere wie von selbst...



  • Habs grad umgestellt und es läuft. Hba ja auch konsequent die T-Notation durchgezogen. Jetzt muss ich nur noch mal die Hashwerte neu berechnen lassen. Thanks 👍


Anmelden zum Antworten