Convert.To[NeedType]?
заодно не спотыкаться о DBNull лучше по-моему написать небольшую оберточку на используемые у тебя типы, где заложить логику, как твое приложение будет понимать значения null. Примерно так(может профи из соседней ветки будут ругаться, только бы в терновый куст не бросали :о)):
unit MyDbUtils;
interface
uses
System.Data.SqlClient, System.Globalization;
type
TMyDbConvert = class
public
class function ToInt16(value: TObject): SmallInt;
class function ToDateTime(value: TObject): DateTime;
class function ToBoolean(value: TObject): Boolean;
end;
implementation
class function TMyDbConvert.ToBoolean(value: TObject): Boolean;
begin
if Value <> dbNull.Value then
Result := Convert.ToBoolean(value)
else
Result := False;
end;
class function TMyDbConvert.ToDateTime(value: TObject): DateTime;
begin
if Value <> dbNull.Value then
Result := Convert.ToDateTime(value)
else
Result := Convert.ToDateTime('01.01.1901', CultureInfo.CurrentUICulture.DateTimeFormat);
end;
class function TMyDbConvert.ToInt16(value: TObject): SmallInt;
begin
if Value <> dbNull.Value then
Result := Convert.ToInt16(value)
else
Result := 0;
end;
end.
const
c_cnstr = 'data source=local;initial catalog=northwind;user id=k2;password=k2;';
c_sel_emp = 'select top 10 * from emp;';
procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
var
conn: SqlConnection;
cmd: SqlCommand;
r: SqlDataReader;
i: integer;
n: decimal;
s: string;
dt: DateTime;
b: Boolean;
begin
conn := SqlConnection.Create(c_cnstr);
cmd := sqlCommand.Create(c_sel_emp, conn);
conn.Open;
r := cmd.ExecuteReader;
while r.Read do begin
i := TMyDbConvert.ToInt16(r['IntField']);
s := r['StringField'].ToString;
dt := TMyDbConvert.ToDateTime(r['DateTimeField']);
b := TMyDbConvert.ToBoolean(r['BitField']);
Response.Write('<p>'+i.ToString+' '+s+' '+dt.ToShortDateString+' '+b.ToString+'</p>');
end;
conn.Close;
end;
если уверен в типе и порядке полей в запросе то в можно например через reader.Get[NeedType](index_field)