Autor Beitrag
bockwurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Mo 17.12.07 10:43 
Ich suche eine Möglichkeit, einen Sprachtreiber, einer Paradox-Tabelle, zur Laufzeit, zu ändern.

Mit meiner momentaner Lösung (Code unten) bekomme ich 2 Probleme !!!!

1. Wenn im Index schon Sonderzeichen vorhanden sind (Ä,ß ...) werden diese falsch konvertiert.
2. Wenn in den Tabellen-Feldnamen Sonderzeichen enthalten. Werden diese Feldnamen auch falsch konvertiert.

Was mache ich falsch?
Wie geht es richtig!


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
function TSprachtreiberHF.ChangeLangDriver(DatabaseName, TableName, LDName: string):boolean;
var
  TblExt: string;
  Database: TDatabase;
  TblDesc: CRTblDesc;
  OptDesc: FLDDesc;
  OptData: array[0..250] of Char;
  Cur: hDBICur;
  Rec: CFGDesc;

begin
  inc(iAnzKon);
  result:=false;
  if (TableName = '') or (LDName = '') then
    raise Exception.Create('Unknown TableName or LDName');
  Database := Session.OpenDatabase(DatabaseName);
  try
   try
    if Database.IsSQLBased then
      raise Exception.Create('Function ChangeLangDriver working only with dBase or Paradox tables');
    FillChar(OptDesc, SizeOf(OptDesc), #0);
    FillChar(TblDesc, SizeOf(TblDesc), #0);
    StrCopy(OptDesc.szName, 'LANGDRIVER');
    OptDesc.iLen := Length(LDName) + 1;

    with TblDesc do
    begin
      StrPCopy(szTblName, TableName);   //1
      TblExt := UpperCase(ExtractFileExt(TableName));

      if TblExt = 'DBF'
        then StrCopy(szTblType, szDbase)
        else if TblExt = '.DB'
              then StrCopy(szTblType, szParadox) //2
              else begin
                     AnsiToOEM(StrPCopy(OptData, DatabaseName), OptData);
                     if DbiOpenCfgInfoList(nil, dbiREADONLY, cfgPersistent,
                              StrPCopy(OptData, '\DATABASES\' + StrPas(OptData) + '\DB INFO\'),
                              Cur) <> DBIERR_NONE
                      then raise Exception.Create('Unknown table type');
                                                   
                      try
                        while DbiGetNextRecord(Cur, dbiNOLOCK, @Rec, nil) <> DBIERR_EOF do
                          if StrComp(Rec.szNodeName, 'DEFAULT DRIVER') = 0 then
                          begin
                            StrCopy(szTblType, Rec.szValue);
                            Break;
                          end;
                      finally
                        Check(DbiCloseCursor(Cur));
                      end;
                   end;

                       
                   
      iOptParams := 1;
      pfldOptParams := @OptDesc;
      pOptData := @OptData;

  
    end;

    StrPCopy(OptData, LDName);


    Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil, nil, nil, False));

    Result:=true;
    MemoGeaendert.Lines.Add(TableName+' - OK: Sprachtreiber erfolgreich umgwandelt');
    Inc(iAnz_Kon_ohne_Fehler);
   except
     on E: EDBEngineError do
        begin
          if e.Errors[0].ErrorCode<>10009 then  // Feldname schon vorhanden
          try
            MemoGeaendert.Lines.Add(' - - - - - - - - - -');
            MemoGeaendert.Lines.Add(E.Message);
            MemoGeaendert.Lines.Add(TableName+' - Fehler: Sprachtreiber wurde nicht umgewandelt');
            MemoGeaendert.Lines.Add(' - - - - - - - - - -');
            inc(iAnz_Kon_mit_Fehler);
          except
          end;
        end;
   end;
  finally
    Session.CloseDatabase(Database);
  end;
end;