我试图将数据从两个单独的表格显示到数据网格视图中,但我知道它可能不是为此目的而设计的,但我确定有办法停止它产生多个重复的行,如下所示;
以下是获取数据的代码(我打算稍后在代码中注释过滤器或特定搜索查询,这是今天的日子);
private void FillPatients()
{
SqlConnection connection = new SqlConnection();
//DateTime timeNow = DateTime.Now;
//string format = "MMM ddd d HH:mm yyyy";
try
{
connection.ConnectionString = connectionPath;
connection.Open();
SqlCommand cmd = new SqlCommand("SELECT BookingId, Date, PatientId, Firstname, Surname FROM Bookings, Patients", connection);
//cmd.Parameters.AddWithValue("@Date", timeNow.ToString(format));
SqlDataAdapter dap = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
dap.Fill(dt);
BindingSource bs = new BindingSource();
bs.DataSource = dt;
dgv.DataSource = bs;
dap.Update(dt);
DialogResult dlgResult;
dlgResult = MessageBox.Show(
"Patients loaded",
"Patients",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1);
}
catch (SqlException sql)
{
MessageBox.Show(sql.Message);
}
finally
{
connection.Close();
connection.Dispose();
}
}
答案 0 :(得分:0)
(从评论转换而来)
您的查询当前产生的是cross join。从本质上讲,这意味着您将从Bookings
中获取每一行以及Patients
中的每一行。
您可能想要的是inner join。内部联接允许您为从“右”表(在本例中为Patients
)加入的记录指定谓词,因此对于每个Booking
,您可以获得与Patient
相关联的WHERE
它基于外键。
注意:您可以通过{{1}}子句通过交叉连接完成相同的结果,但它已被弃用,并且根据RDBMS,您可能会看到不同的性能。
答案 1 :(得分:-1)
我希望您需要将SQL更改为:
SELECT BookingId, Date, PatientId, Firstname, Surname
FROM Bookings
INNER JOIN Patients ON Patients.PatientId = Bookings.PatientId;