Piszę w Lazarusie program bazodanowy łączący się przez ODBC. Mam 2 bazy z identycznymi tabelkami (tak mi się przynajmniej wydaje). Niestety, kiedy dodaję te pola do komponentu SQLQuery, to zależnie od tego, do której bazy się łączę, wczytuje inne typy pól (niestety nie są one do końca kompatybilne).
Przykładowa tabelka w bazach wygląda tak:
ID: integer
NAME: Varchar(20)
PASSWORD: Varchar(30)
Firebird:
MySQL:
Jeżeli łączę się do Firebirda, to wczytuje mi do SQLQuery takie pola:
object SQLQuery1: TSQLQuery
IndexName = 'DEFAULT_ORDER'
FieldDefs = <
item
Name = 'ID'
DataType = ftInteger
Precision = -1
Size = 0
end
item
Name = 'NAME'
DataType = ftString
Precision = -1
Size = 20
end
item
Name = 'PASSWORD'
DataType = ftString
Precision = -1
Size = 30
end>
Active = True
AutoCalcFields = False
Database = ODBCConnection2
Transaction = SQLTransaction2
SQL.Strings = (
'SELECT * FROM users;'
)
Params = <>
left = 224
top = 8
object SQLQuery1ID: TLongintField
DisplayWidth = 10
FieldKind = fkData
FieldName = 'ID'
Index = 0
LookupCache = False
ProviderFlags = [pfInUpdate, pfInWhere]
ReadOnly = False
Required = True
end
object SQLQuery1NAME: TStringField
DisplayWidth = 20
FieldKind = fkData
FieldName = 'NAME'
Index = 1
LookupCache = False
ProviderFlags = [pfInUpdate, pfInWhere]
ReadOnly = False
Required = True
end
object SQLQuery1PASSWORD: TStringField
DisplayWidth = 30
FieldKind = fkData
FieldName = 'PASSWORD'
Index = 2
LookupCache = False
ProviderFlags = [pfInUpdate, pfInWhere]
ReadOnly = False
Required = True
Size = 30
end
end
Natomiast z MySQL wczytuje mi takie pola:
object SQLQuery1: TSQLQuery
IndexName = 'DEFAULT_ORDER'
FieldDefs = <
item
Name = 'ID'
DataType = ftInteger
Precision = -1
Size = 0
end
item
Name = 'NAME'
DataType = ftString
Precision = -1
Size = 20
end
item
Name = 'PASSWORD'
DataType = ftString
Precision = -1
Size = 30
end>
Active = True
AutoCalcFields = False
Database = IBConnection1
Transaction = SQLTransaction2
SQL.Strings = (
'SELECT * FROM users;'
)
Params = <>
left = 224
top = 8
object SQLQuery1ID: TAutoIncField
DisplayWidth = 10
FieldKind = fkData
FieldName = 'ID'
Index = 0
LookupCache = False
ProviderFlags = [pfInWhere]
ReadOnly = False
Required = False
end
object SQLQuery1NAME: TWideStringField
DisplayWidth = 20
FieldKind = fkData
FieldName = 'NAME'
Index = 1
LookupCache = False
ProviderFlags = [pfInUpdate, pfInWhere]
ReadOnly = False
Required = False
Size = 40
end
object SQLQuery1PASSWORD: TWideStringField
DisplayWidth = 30
FieldKind = fkData
FieldName = 'PASSWORD'
Index = 2
LookupCache = False
ProviderFlags = [pfInUpdate, pfInWhere]
ReadOnly = False
Required = False
Size = 60
end
end
Dlaczego tak się dzieje?