【发布时间】:2013-12-20 10:44:32
【问题描述】:
我无法在 Delphi XE2 中使用 ADO 获取 IDENTITY 列。
问题 ADO 字段属性不返回/不包含任何 IDENTITY 列。 连接中是否有可以获取 IDENTITY 列的属性或其他东西,或者这是一个已知的错误?
场景 我有一个存储过程(在 SYBASE ASE 中),它获取 1 行和 4 列。 其中一列是 IDENTITY 列。
在此示例中:ADOQuery.Fields.Count 将返回 3 而不是 4。缺少 IDENTITY 列。
例如:
procedure TForm1.FormCreate(Sender: TObject);
var
test: string;
Password: String;
UserName: string;
ServerName : string;
NoRec: integer;
MyValue: integer;
begin
Password:='xxxx';
UserName:='yyyy';
ServerName := 'zzzzz';
ADOConnection := TADOConnection.Create(Application);
with ADOConnection do
begin
CommandTimeout := 0;
IsolationLevel := ilSerializable;
Attributes := [xaAbortRetaining];
KeepConnection := True;
LoginPrompt := False;
ConnectionString := 'Provider=ASEOLEDB.1;Password=' + Password +
';Persist Security Info=True' + ';User ID=' +
UserName + ';Data Source=' + ServerName;
end;
if not Assigned(ADOQuery) then
begin
ADOQuery := TADOQuery.Create(Application);
with ADOQuery do
begin
CommandTimeout := 0;
DisableControls;
CacheSize := 500;
Connection := ADOConnection;
CursorType := ctOpenForwardOnly;
end;
end;
ADOConnection.Open();
ADOQuery.SQL.Text:= 'sp_echo';
ADOQuery.Open;
NoRec:=ADOQuery.Fields.Count; //This will return: 3, the IDENTITY col is missing
//Trying to fetch the column this way, will fail (the field doesen´t exist):
//MyValue:=ADOQUery.FieldByName('col_1').AsInteger
end;
这里是这个例子的脚本、表格、存储过程
create table tbl_echo
(
col_1 numeric(10,0) identity,
col_2 varchar(255),
col_3 int,
col_4 int
)
insert into tbl_echo (col_2, col_3, col_4) select 'testing', 100, 200
create proc sp_echo
as
select top 1 * from tbl_echo
【问题讨论】:
-
我正在使用获取 1 单行的存储过程。
-
@Jens,这是一个 SYBASE ASE 数据库。
-
你试过使用TADOStoredProc吗?
-
您的代码无效,请将其编辑为SSCCE
-
好吧,现在更有意义了,为什么还要创建一个额外的
TADODataSet?尤其是分配给ADODataSet.RecordSet对我来说似乎很不寻常。
标签: delphi delphi-xe2 ado sap-ase recordset