2017-04-03 121 views
-2

在我的BD格选择表的名字后,我想有一个通过双击属于该表中科朗但我发现这个错误访问冲突0x00840bd7:读取地址0x00000000'。流程....(5644)“

lorqueĴ双'在0x00840bd7访问冲突:读取0x00000000地址的' 点击例外 '第一次机会',以$ 00840BD7 Exception类$ 0000005与消息。过程conversion.exe(5644)“ 这里是代码:

procedure TForm5.DBGrid1DblClick(Sender: TObject); 

begin 
    FDQuery2.SQL.Clear; 
FDQuery2.SQL.Text := 'select column_name from information_schema.columns where table_schema="bases" and table_name = "'+DBGrid2.SelectedField.ToString+'"'; 
FDQuery2.Open; 
ListBox2.Clear; 
FDQuery2.GetFieldNames(ListBox2.Items); 
end; 

你能帮助我吗?

+1

也许你应该指定在哪一行你得到访问冲突。您是否尝试着使用调试器并查看哪个对象引用导致了它? – Frazz

+0

错误信息已足够清楚。你有一个零指针或引用的地方。你为什么不自己调试呢?为什么在进行基本调试之前问这里?或者,您的问题实际上是关于错误消息的含义? –

+0

你的问题是什么? –

回答

3

如果你重写你的代码是这样的:

var 
    AField : TField; 
begin 
    AField := DBGrid2.SelectedField; 
    Caption := AField.ToString; 

    FDQuery2.Close; 
    FDQuery2.SQL.Text := 'select column_name from information_schema.columns where table_schema="bases" and table_name = "'+DBGrid2.SelectedField.ToString+'"'; 
    FDQuery2.Open; 
    ListBox2.Clear; 
    FDQuery2.GetFieldNames(ListBox2.Items); 

并运行它,你应该能够立即你的问题是什么看。

ToString确实返回网格的选定字段的值 - 在你的情况下,它返回TStringField,这是该领域的类型。不是它的字符串值。要从表中获取其字符串值,请使用DBGRid2.SelectedField.AsString

有一对夫妇的其他东西我觉得是你的代码错误:

  1. 使用一个DBGrid的SelectedField访问一个字段的值。一般来说,这是可以做的,但由于你的情况你已经知道你需要哪个字段 - Table_Name - 请求用户点击它的点是什么?另外,用户可能会选择错误的列。

    最好使用FDQuery2.FieldByName('Table_Name').AsString

  2. 我敢打赌,你的DBGrid2通过其数据源连接到FDQuery2。如果是这样,根据你已经在DBGrid2中显示的内容查询,除非你知道你在做什么,否则就是在寻找麻烦。如果您仍在使用其他q中的代码,则最好从FDQuery1获取Table_Name值。

在任何情况下,我的回答你的其他Q,Display database structure from Delphi (rad studio),我展示了如何设置主从联动的两个表之间,使得第二个,表列之一,是自动与第一个表中的选定表同步。

+0

感谢您的回复 – sasa

相关问题