2016-04-30 31 views
8

Bir .mdb dosyasından (MSAccess 2000 biçimi) veri okuyorum. Adlarında iki noktaya sahip olan bazı tablolar var.Adında iki nokta üst üste sahip bir tablo nasıl çalıştırılır?

EOleException with message 'Parameter object is improperly defined. Inconsistent or incomplete information was provided'. 

bu benim kodudur:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Query: TADOQuery; 
begin 
    Query := TADOQuery.Create(nil); 
    Query.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+ 
    'Data Source=DB.mdb;Persist Security Info=False'; 
    Query.SQL.Text := 'select * from [Table1:1]'; 
    try 
    Query.Open; 
    finally 
    Query.Free; 
    end; 
end; 

cevap

8

TQuery:if ParamCheck = true yorumlayacak ben bu tablolarda sorguları açmaya çalışırken bir istisna alıyorum.
ParamCheck:= false'u ayarlayın ve SQL.Text'u ayarlayın.

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Query: TADOQuery; 
begin 
    Query := TADOQuery.Create(nil); 
    Query.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+ 
    'Data Source=DB.mdb;Persist Security Info=False'; 
    Query.ParamCheck:= false; 
    Query.SQL.Text := 'select * from [Table1:1]'; 
    try 
    Query.Open; 
    finally 
    Query.Free; 
    end; 
end; 

Şimdi çalışıyor. coloned tablo/sütun adları ve kesinlikle onları iki nokta üst üste ile tablo/sütun adları kullanarak yolda gitmek gerekir ve hala o zaman bir makro kullanabilirsiniz sorgunuzda başka params kullanmak istiyorsanız
parametreleri birleştiren

tablo/sütun adını doldurmak için.
Bu, FireDac gerektirir. Bunun için çok dikkatli olmanızı tavsiye ederim çünkü parametrelerin aksine makrolar SQL enjeksiyonuna karşı güvenli değildir!

bakınız: Diğer dilinde çözüm kontrol ediyordu http://docwiki.embarcadero.com/CodeExamples/Seattle/en/FireDAC.TFDQuery.Macros_Sample

+0

Daha önce eklenmiş olabilecek tüm parametreleri kaldırmayı unutmayın. 'Parameters' özelliğini kontrol edin. – GolezTrol

+0

@GolezTrol: 'SQL.Text' ayarını' 'Parameters' 'otomatik olarak ayarlamaz mı? –

+1

ParamCheck öğesini false olarak ayarlarsanız, bunun olmadığını düşünüyorum. Parametreleri tek başına bırakır, böylece bunları kendiniz yönetebilirsiniz. % 99 emin. ;) – GolezTrol

4

. Ancak, Johan's answer, doğru olanı gibi görünüyor, ancak here yayınlanmış olanı da, Delphi/Access durumunda çalışır:

Backtick'leri kullanarak tablename, param denetimi tarafından göz ardı edilmesine izin vermelidir.

Query.SQL.Text := 'select * from `Table1:1`'; 

Bu, sorgu dizesindeki parametreler kullanılarak da birleştirilebilir.

+0

Delphi hakkında bilmiyorum, ancak MS Access * asla * backticks kullanır. Tablo/alan adları, ör. boşlukların her zaman [köşeli parantez] gerekir. – Andre

+0

@Andre Az önce MS Access 2007'de bir sorgu oluşturdum ve bu sorgu dizesini SQL görünümünde yazdım. Sorunu sorunsuz olarak gösterir. – saastn

+0

Haklısınız (ve yanılmışım) - köşeli ayraçlar yerine parantezler kullanılabilir. Şaşırtıcı. :) 'SELECT [Tabelle1: 1] .ID, \ Tabelle1: 1 \'. \ Nix: dings \ ' FROM [Tabelle1: 1];', backticks olmadan çalışır. – Andre

İlgili konular