使用一个SELECT
查询,代码似乎正确地添加到列表框中,但是当我添加另一个查询时,列表框不再显示任何内容,而且似乎rdr[3]
不存在(联系人有3列,Numar_contact
有一列(这应该是rdr[3]
吗?)
string connString = @"database=Agenda_db; Data Source=Marian-PC\SQLEXPRESS; Persist Security Info=false; Integrated Security=SSPI";
SqlConnection conn = new SqlConnection(connString);
try {
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Contact;"+ "SELECT * FROM Numar_contact", conn)
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
listBox1.Items.Add(rdr[0].ToString() + ' ' + rdr[1].ToString() + ' ' + rdr[2].ToString()+' '+ rdr[3].ToString());
}
rdr.Close();
答案 0 :(得分:3)
使用UNION
加入您的查询。您现在获得它的方式,它将返回两个结果集。
SELECT [col1], [col2] FROM Contact
UNION ALL
SELECT [col1], [col2] FROM Numar_contact
正如DJ KRAZE在评论中所指出的那样,将它包装在一个sproc或TVF中可能并不是一个坏主意。但这也会奏效。
修改强>
我刚刚通过评论了解到这两个表实际上是无关的。鉴于此,我很想使用两个SqlCommand
s和两个不同的foreach
循环。但如果你以这种方式出售,
SELECT id_contact, nume_contact, prenume_contact FROM Contact
UNION ALL
SELECT id_contact, numar, NULL FROM Numar_contact
这将对齐两个表中的数据,但如果第二个表没有[prenume_contact]
,则会选择NULL
。我可能在这里混淆了列的位置,因为我不太明白这些名称的含义。
编辑2:
string connString = @"database=Agenda_db; Data Source=Marian-PC\SQLEXPRESS; Persist Security Info=false; Integrated Security=SSPI";
using (SqlConnection conn = new SqlConnection(connString))
{
try
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Contact", conn))
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
listBox1.Items.Add(rdr[0].ToString() + " " + rdr[1].ToString() + " " + rdr[2].ToString());
}
}
using (SqlCommand cmd2 = new SqlCommand("SELECT * FROM Numar_contact", conn))
using (SqlDataReader rdr2 = cmd.ExecuteReader())
{
while (rdr2.Read())
{
listBox1.Items.Add(rdr2[0].ToString() + " " + rdr2[1].ToString());
}
}
}
catch { }
}
编辑3,感谢Scott Chamberlain的见解:
另一方面,您可能希望执行某种JOIN
,最常见的是INNER JOIN
。请注意,这与我们以前谈过的任何操作完全不同。
SELECT Contact.id_contact, Contact.nume_contact, Contact.prenume_contact, Numar_contact.numar
FROM Contact
INNER JOIN Numar_contact on Contact.id_contact = Numar_contact.id_contact
这会将两个表绑定在一起,为每个contact-numar_contact返回一条记录。同样,这肯定不与执行UNION
相同。在选择所需内容之前,请确保您已了解其中的差异。
如果您的第二个表包含与第一个表多对一的数据,请使用此选项。
答案 1 :(得分:1)
感谢your comment,你想要做的是JOIN表格。
SELECT Contact.id_contact, nume_contact, prenume_contact, numar
FROM Contact
INNER JOIN Numar_contact on Contact.id_contact = Numar_contact.id_contact
这会将两个表组合成四列,其中id_contact在两个表中都匹配。
您可能需要INNER JOIN
或LEFT JOIN
,具体取决于您是否希望仅在第二个表中有项目时显示行,或者只显示第4列{{ 1}}。
答案 2 :(得分:1)
是的,你可以。
以下an example from the MSDN我已修改为使用您的代码 - 您需要将阅读器移至Next ResultSet
string connString = @"database=Agenda_db; Data Source=Marian-PC\SQLEXPRESS; Persist Security Info=false; Integrated Security=SSPI";
SqlConnection conn = new SqlConnection(connString);
SqlCommand myCommand = new SqlCommand("SELECT * FROM Contact; SELECT * FROM Numar_contact", conn);
SqlDataReader myReader ;
int RecordCount=0;
try
{
myConnection.Open();
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
//Write logic to process data for the first result.
RecordCount = RecordCount + 1;
}
MessageBox.Show("Total number of Contacts: " + RecordCount.ToString());
bool moreResults = myReader.NextResult(); // <<<<<<<<<<< MOVE TO NEXT RESULTSET
RecordCount = 0;
while (moreResults && myReader.Read())
{
//Write logic to process data for the second result.
RecordCount = RecordCount + 1;
}
MessageBox.Show("Total number from Numar_contacts: " + RecordCount.ToString());
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close(); // Could be replaced with using statement too
}