从MYSQL数据库中显示C#部分数据

时间:2015-09-17 09:42:10

标签: c# mysql

我有一个MYSQL数据库,用于在电视节目中存储有关访客的数据。需要应用以下命令:

MySqlCommand cmd = new MySqlCommand(
@"select  
   guest.name,
   guest.occupation,
   guest.pv,
   guest.phone,
   guest.mobile,
   guest.email,
   program.name,
   episode.date, 
   episode.time  
from 
   guest,
   program,
   host,
   episode 
where guest.name=episode.guestnamefk
 AND host.name=episode.hostnamefk 
 AND program.name=episode.programnamefk
 AND  guest.name  Like '%" + searchnamebox.Text + "%' ", conn);

我有两种搜索方式,第一种是快速搜索,它采用用户编写的内容并按照以下方式搜索:

    string syn = 
@"select 
   name,
   pv,
   country,
   occupation ,
   type ,
   phone,
   mobile ,
   email 
from 
   guest 
where 
   name like '%" + textBox1.Text + "%' 
OR pv like '%" + textBox1.Text + "%'
OR phone like '%" + textBox1.Text + "%' 
OR mobile like '%" + textBox1.Text + "%' 
OR email like '%" + textBox1.Text + "%' 
OR  country like '%" + textBox1.Text + "%' 
OR type like '%" + textBox1.Text + "%' 
OR occupation like '%" + textBox1.Text + "%' ";

当我应用第二个查询时,我得到了正确的结果,但是当我应用第一个查询时,我只得到第一个名字。我相信在我的数据库中链接表有问题,但使用字符串链接是否有问题,因为使用id现在不适合我的程序?

1 个答案:

答案 0 :(得分:1)

这可能是与数据相关的问题,但如果没有用于执行查询或示例数据的代码,则无法确定。这个答案只是一个有根据的猜测。

第一个查询在4个表guestprogramhostepisode之间执行内部联接。它相当于使用INNER JOIN的以下语法,实际上,现在考虑不推荐使用原始连接格式:

from 
   guest 
   inner join episode on guest.name=episode.guestnamefk
   inner join host on host.name=episode.hostnamefk,
   inner join program on program.name=episode.programnamefk
where 
   guest.name  Like '%someFragment%';

只有当所有条件匹配时,如果有名称中包含someFragment的客户 ON ,此查询才会返回结果,即guestnamefk与{name完全相同1}},hostnamefk完全等于host等。如果甚至有一个字符不同,即使是开头或结尾的空格,匹配也会失败。通常情况下,匹配不会考虑字母大小写,John匹配JOHN,但不会John

使用名称或任何具有商业意义的信息作为关键是一个坏主意。如果nameJohnguestnamefk必须John。如果重命名了第一个名称,则更改必须级联到所有相关记录。

出于这个原因,代理键几乎总是用作主键,例如名为GuestId的整数字段。这允许您仅更改来宾表中的来宾名称,而不必影响其他任何内容。

如果您想要在没有匹配剧集,主持人或节目的情况下检索访客,您需要使用LEFT JOIN,它会返回左侧的所有记录以及右侧的任何匹配记录,如果右侧没有匹配则返回NULL。使用LEFT JOIN是调试失败的INNER JOIN查询的一种非常好的方法。

from 
   guest 
   left outer join episode on guest.name=episode.guestnamefk
   left outer host on host.name=episode.hostnamefk,
   left outer program on program.name=episode.programnamefk
where 
   guest.name  Like '%someFragment%';

如果所有表中只有一个匹配记录,则只返回一条记录。

您可以尝试使用FULL OUTER JOIN检查所有不匹配。对于左侧和右侧的非匹配记录,这将返回null。这将揭示,例如guestnamefk是否同时包含JohnJohn条目。以下查询将仅返回某些缺少链接的记录:

from 
   guest 
   full outer join episode on guest.name=episode.guestnamefk
   full outer host on host.name=episode.hostnamefk,
   full outer program on program.name=episode.programnamefk
where 
   guest.name  is null
   or episode.guestnamefk is null 
   or program.name is null
   or host.name is null;

另一种可能性是查询执行不正确。例如,如果使用ExecuteReader(),则可能会丢失对Read()的调用。丢失的大括号可能导致执行跳过Read的调用。调用break,继续or return`可能会提前终止循环。再说一次,如果不看代码,就无法猜测。