2015-04-22 122 views
0

我有FDQuery和DataSource和DBGrid。现在,我写在按钮FireDAC查询连接到DBGrid

FDQuery2->Active = false; 
    FDQuery2->SQL->Clear(); 
    FDQuery2->SQL->Add(" SELECT C.patient_id, P.patient_name, C.check_id " 
        " FROM Checkup C " 
        " INNER JOIN Patient P ON (C.patient_id=P.patient_id) " 
        " WHERE C.today = " + MaskEdit1->Text + 
        " ORDER BY C.check_id "); 
    FDQuery2->Active = true; 

这个代码,我FDQuery连接到数据源和将TDataSource到DBGrid的,但是当我按一下按钮它不显示行。并且我相信SQL代码是可行的,因为当我在SQL字符串内部写入行时就已经显示出来了。 任何想法。

+0

什么数据类型是C.today列?另外,请注意您的标签选择 - “builder”不涉及C++ Builder(“C++ builder”标签)。这里的标签具有特定的含义;使用前请阅读说明。使用适当的标签可以在可以回答问题的人面前提出问题,并将其正确分类以供将来用户搜索答案。谢谢。 –

+0

的数据类型为text – nashwa

+0

谢谢sooooooooooooo多 – nashwa

回答

1

连接文本时,您错过了围绕您的值的'。更改你的WHERE子句:

FDQuery2->SQL->Clear(); 
FDQuery2->SQL->Add(" SELECT C.patient_id, P.patient_name, C.check_id " 
       " FROM Checkup C " 
       " INNER JOIN Patient P ON (C.patient_id=P.patient_id) " 
       " WHERE C.today = '" + MaskEdit1->Text + "'" + 
       " ORDER BY C.check_id "); 

不过你应该学会使用参数化查询。它允许数据库驱动程序处理诸如为您正确引用文本或格式化日期等事情,并且它也(重要)防止SQL注入。

FDQuery2->SQL->Clear(); 
FDQuery2->SQL->Add(" SELECT C.patient_id, P.patient_name, C.check_id " 
       " FROM Checkup C " 
       " INNER JOIN Patient P ON (C.patient_id=P.patient_id) " 
       " WHERE C.today = :today" + 
       " ORDER BY C.check_id "); 
FDQuery2->ParamByName("today")->AsString = MaskEdit1.Text; 
FDQuery2->Active = true; 
+0

感谢您的回答。 – nashwa

+0

和它的工作..但还有另一个问题。 我有一个数据源,正如我所说,每次我改变“今天”的值,我应该刷新它 DataSource1-> DataSet-> Refresh(); 没问题..但是当我从表中删除记录和ApplyUpdate(-1)然后刷新()连接到查询的数据源时,它会说“你应该在刷新之前应用更新”! – nashwa

+0

“其他问题”是一个与这个问题无关的新问题,您应该提出一个新问题来询问问题。你可以回到这个参考。这个问题的问题已经得到解答。 :-)你可以发布你的代码,试图在那个我们可以看到它的新问题中进行删除/应用更新/刷新。 –