具有多个查询的SqlCommand不起作用

时间:2014-07-15 21:45:50

标签: c# sql sql-server-express

使用一个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();

3 个答案:

答案 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 JOINLEFT 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
}