我又试了试Delphi7,也是一样的错。
我想,BCB/Delphi的ADO是封装过了,会不会是封装得有问题?
于是跑到VB下写了个Demo,居然成功了~看来真的是封装的问题。
看来只有通过OLE直接操纵ADO了,写了段代码,试了试,也成功了
BCB代码如下:
1 void __fastcall TForm1::Button1Click(TObject *Sender)
2 {
3 const AnsiString sql = "SELECT * FROM Table WHERE ROWNUM <= 1";
4
5 Variant Conn;
6 Variant ResultSet;
7 Variant ResultField;
8 Variant Size, Value;
9
10 Conn = Variant::CreateObject("adodb.connection");
11 Conn.OlePropertySet("Provider", "OraOLEDB.Oracle");
12 Conn.OleFunction("Open", "Database", "UserName", "Password");
13
14 ResultSet = Variant::CreateObject("adodb.recordset");
15 ResultSet.OleFunction("Open", sql, Conn, 0, 1);
16 ResultField = ResultSet.OlePropertyGet("Fields", "FieldNameOrIndex");
17 Size = ResultField.OlePropertyGet("ActualSize");
18 Value = ResultField.OleFunction("GetChunk", Size);
19
20 void* Data = NULL;
21 SafeArrayAccessData(Value.parray, &Data);
22 try
23 {
24 TFileStream* Stream = new TFileStream("C:\\blob.txt", fmCreate);
25 try
26 {
27 Stream->Write(Data, Size);
28 } __finally {
29 delete Stream;
30 }
31 } __finally {
32 SafeArrayUnaccessData(Value.parray);
33 }
34 }
2 {
3 const AnsiString sql = "SELECT * FROM Table WHERE ROWNUM <= 1";
4
5 Variant Conn;
6 Variant ResultSet;
7 Variant ResultField;
8 Variant Size, Value;
9
10 Conn = Variant::CreateObject("adodb.connection");
11 Conn.OlePropertySet("Provider", "OraOLEDB.Oracle");
12 Conn.OleFunction("Open", "Database", "UserName", "Password");
13
14 ResultSet = Variant::CreateObject("adodb.recordset");
15 ResultSet.OleFunction("Open", sql, Conn, 0, 1);
16 ResultField = ResultSet.OlePropertyGet("Fields", "FieldNameOrIndex");
17 Size = ResultField.OlePropertyGet("ActualSize");
18 Value = ResultField.OleFunction("GetChunk", Size);
19
20 void* Data = NULL;
21 SafeArrayAccessData(Value.parray, &Data);
22 try
23 {
24 TFileStream* Stream = new TFileStream("C:\\blob.txt", fmCreate);
25 try
26 {
27 Stream->Write(Data, Size);
28 } __finally {
29 delete Stream;
30 }
31 } __finally {
32 SafeArrayUnaccessData(Value.parray);
33 }
34 }