【问题标题】:the result doesn't appear in listbox结果没有出现在列表框中
【发布时间】:2011-12-13 06:08:49
【问题描述】:

请问我下面的代码有什么问题吗?因为它没有显示结果。我想查看员工的姓名,他们每月的活动数量,然后除以数量来查看他们的平均成绩。活动到他们的分数。我希望你能帮助我做到这一点。我想在列表框中查看它

格式是这样的:

Juan Dela Cruz
Count: 10    
Score: 5
Grade: 2

econ = new SqlConnection();
econ.ConnectionString = emp_con;
econ.Open();
int found = -1;
string Log_User, Count, Score;
int iGrade = 0;
string n = "";
string strScore = "Score: ";
string strGrade = "Grade: ";
string strCount = "Count: ";
ecmd = new SqlCommand("SELECT Log_User, Count = COUNT(Det_Score), Score = SUM(Det_Score) FROM MEMBER M,DETAILS D WHERE D.Emp_Id = M.Emp_Id AND Month(Sched_Start) like" + "'" + comMonth.Text + "'AND Year(Sched_Start) like" + "'" + txtYear.Text + "'GROUP BY Log_User", econ);
ecmd.CommandType = CommandType.Text;
ecmd.Connection = econ;
dr = ecmd.ExecuteReader();
listBox1.Text = txtYear.Text;
listBox1.Text = comMonth.Text;
while (dr.Read())
{
 Log_User = (string)dr["Log_User"];
 Count = (string)dr["Count"];
 Score = (string)dr["Score"];
 iGrade = Convert.ToInt32(Count) / Convert.ToInt32(Score);
 found += 1;
 listBox1.Items.Insert(found, Convert.ToString(n));
 listBox1.Items.Insert(found, Convert.ToString(strGrade) + Convert.ToString(iGrade));
 listBox1.Items.Insert(found, Convert.ToString(strScore) + Convert.ToString(Score));
 listBox1.Items.Insert(found, Convert.ToString(strCount) + Convert.ToString(Count));
 listBox1.Items.Insert(found, Convert.ToString(Log_User));
 listBox1.Items.Insert(found, Convert.ToString(n));
}

econ.Close();
}
catch (Exception x)
{
  MessageBox.Show(x.GetBaseException().ToString(), "Connection Status", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

我想在这里查看结果,但看不到输出。我的sql语句有问题吗??在 MS SQL 2005 中,当我运行 sql 时,它运行顺利,但是当我将它运行到 VS 2010 时,它没有出现。

【问题讨论】:

  • 请不要在标题末尾添加“C#”。这就是 for 的标签。
  • 对不起.. 你能告诉我我的代码有什么问题吗?谢谢..
  • 没有。阅读的代码太多了。创建一个重现问题的小示例,然后发布示例。
  • 解决此问题后,您可能希望将代码扔到 StackExchange 代码审查中……您需要处理大量未正确处理的资源。 econ.Close() 不足以让您远离麻烦。

标签: c# sql-server


【解决方案1】:

可能是几个问题。

您是否尝试在 Sql Management Studio 中运行 sql 语句?

他们有结果吗?

如果是这样,请尝试使用

listbox1.Items.Add 而不是Insert

没有异常错误,仪式?

如果我是你,我会使用sqlDataAdapter 并将所有结果放入datatable 然后我会检查datatable 是否有任何行。如果是这样,我将循环并将它们添加到列表框中。

【讨论】:

  • 至少,在第一个 Insert 语句处设置一个断点,然后在 Locals 窗口中查看列表框对象(或将鼠标悬停在它上面),并查看该值是否已设置。我的猜测是,它根本没有被设置。就像威廉说的,使用添加,而不是插入。此外,将数据放入数据表可以更轻松地查看和调试。
  • 我在我的SQL Management Studio上试了一下,运行流畅。但在 VS 2010 中它不运行。我试过你的 listbox1.Items.Add 它显示红线。我将尝试 SQLDataAdapter,并在此处发布结果。
  • 使用 Fischermaen 的 listbox1.Items.Add 方法来正确显示.. 如果仍然有问题。首先创建一个临时的listItem。然后填写listItem.ValuelistItem.Text之后listbox1.Items.Add(listItem)
【解决方案2】:

我更改了您的代码,使其可以正常工作:

econ = new SqlConnection(); 
econ.ConnectionString = emp_con; 
econ.Open(); 
string Log_User, Count, Score; 
int iGrade = 0; 
string n = ""; 
string strScore = "Score: "; 
string strGrade = "Grade: "; 
string strCount = "Count: "; 
ecmd = new SqlCommand("SELECT Log_User, Count = COUNT(Det_Score), Score = SUM(Det_Score) FROM MEMBER M,DETAILS D WHERE D.Emp_Id = M.Emp_Id AND Month(Sched_Start) like" + "'" + comMonth.Text + "'AND Year(Sched_Start) like" + "'" + txtYear.Text + "'GROUP BY Log_User", econ); 
ecmd.CommandType = CommandType.Text; 
ecmd.Connection = econ; 
dr = ecmd.ExecuteReader(); 
listBox1.Items.Add(txtYear.Text); 
listBox1.Items.Add(comMonth.Text); 
while (dr.Read()) 
{ 
 Log_User = (string)dr["Log_User"]; 
 Count = (string)dr["Count"]; 
 Score = (string)dr["Score"]; 
 iGrade = Convert.ToInt32(Count) / Convert.ToInt32(Score); 
 listBox1.Items.Add(string.Format("{0}", n)); 
 listBox1.Items.Add(string.Format("Grade: {0}", iGrade))); 
 listBox1.Items.Add(string.Format("Score: {0}",  Score))); 
 listBox1.Items.Add(string.Format("Count: {0}", Count)); 
 listBox1.Items.Add(Log_User); 
 listBox1.Items.Add(n.ToString()); 
} 

econ.Close(); 
} 
catch (Exception x) 
{ 
  MessageBox.Show(x.GetBaseException().ToString(), "Connection Status", MessageBoxButtons.OK,     MessageBoxIcon.Error); 
} 

【讨论】:

  • @Kevzz: 然后调试代码,while (dr.Read())肯定有错误。
  • 感谢您的代码.. 我正在尝试调试我的代码.. 到目前为止,结果正在显示,但我的一些代码仍然需要更改.. 顺便谢谢
【解决方案3】:

你最大的问题是你的 SQL 语句,特别是喜欢。您不添加 %,因此除非用户输入,否则您不会得到任何结果。

另外,我认为 like 在这种情况下不合适,因为您正在寻找月份数。

最后,您应该使用参数来防止 SQL 注入,但我将把它留作另一个练习。

这是您需要的最小更改:

ecmd = new SqlCommand("SELECT Log_User, Count = COUNT(Det_Score), Score = SUM(Det_Score) FROM MEMBER M,DETAILS D WHERE D.Emp_Id = M.Emp_Id AND Month(Sched_Start) = " + comMonth.Text + " AND Year(Sched_Start) = " + txtYear.Text + " GROUP BY Log_User", econ);

另外,你不需要在列表项上使用 insert,你应该使用 add 代替:

listBox1.Items.Add(Convert.ToString(n));
etc...

最后,您应该从数据库中转换值,以防它们包含 DBNulls:

Log_User = dr["Log_User"] as string;
etc...

【讨论】:

    【解决方案4】:

    替换插入以添加。

     if (dr == null || !dr.HasRows) {
                                     //No records found
                                    }
         else
           {
         listBox1.Items.Add(found, Convert.ToString(n));
         listBox1.Items.Add(found, Convert.ToString(strGrade) + Convert.ToString(iGrade));
         listBox1.Items.Add(found, Convert.ToString(strScore) + Convert.ToString(Score));
         listBox1.Items.Add(found, Convert.ToString(strCount) + Convert.ToString(Count));
         listBox1.Items.Add(found, Convert.ToString(Log_User));
         listBox1.Items.Add(found, Convert.ToString(n));
          }
    

    问候

    【讨论】:

    • 把括号里找到的删掉就行了。。谢谢你的帮助。 :D
    【解决方案5】:

    您确定 SQL 查询在 SQL Mgmt Studio 中正确运行吗?您没有在 Count 字段上进行分组(至少),因此您应该得到一个聚合错误。

    另外,您可能想要正确的加入,而不是通过 WHERE 子句加入(个人偏好)。

    实际上,您的 SQL 语句似乎已损坏。试试这个:

    SELECT Log_User, COUNT(Det_Score) as count, SUM(Det_Score) as Score
    FROM MEMBER M
        JOIN DETAILS D on M.Emp_Id = D.Emp_Id
    WHERE MONTH(Sched_Start) like + "' + comMonth.Text + '" AND YEAR(Sched_Start) LIKE "' + txtYear.Text '"
    GROUP BY Log_User, COUNT(Det_Score) as count, SUM(Det_Score) as Score
    

    【讨论】:

      【解决方案6】:
      listBox1.Items.Clear();
      listBox1.Text = "";
      econ = new SqlConnection();
      econ.ConnectionString = emp_con;
      econ.Open();
      float iGrade = 0;
      float Grade = 0.00F;
      string Log_User;
      float Count, Score;
      string n = "";
      string strScore = "Score: ";
      string strGrade = "Grade: ";
      string strCount = "Count: ";
      string date = DateTime.Now.ToShortTimeString();
      ecmd = new SqlCommand("SELECT Log_User, Count = COUNT(Det_Score), Score = SUM(Det_Score) FROM MEMBER M,DETAILS D WHERE D.Emp_Id = M.Emp_Id AND Log_User like" + "'" + Convert.ToString(comEmployee.Text) + "'AND Month(Sched_Start) =" + "'" + Convert.ToInt32(iMonth) + "'AND Year(Sched_Start) =" + "'" + Convert.ToInt32(txtYear.Text) + "'GROUP BY Log_User", econ);
      ecmd.CommandType = CommandType.Text;
      ecmd.Connection = econ;
      dr = ecmd.ExecuteReader();
      listBox1.Items.Add("As of " + date + ": "+ comMonth.Text + ", "+ txtYear.Text);
      while (dr.Read())
      {
         if (dr == null || !dr.HasRows)
         {
            MessageBox.Show("No record found.", "Error");
         }
         else
         {
            Log_User = (string)dr["Log_User"];
            Count = (dr["Count"] as int?) ?? 0;
            Score = (dr["Score"] as int?) ?? 0;
            try
            {
               iGrade = Score / Count;
               Grade = iGrade * 100;
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine("Exception occured");
            }
            listBox1.Items.Add(Convert.ToString(n));
            listBox1.Items.Add(Convert.ToString(Log_User));
            listBox1.Items.Add(Convert.ToString(strCount + Count));
            listBox1.Items.Add(Convert.ToString(strScore + Score));
            listBox1.Items.Add(Convert.ToString(strGrade + Grade));
            }
         }               
         econ.Close();
      

      上面的代码是我对我的问题的回答..我希望它可以帮助别人。感谢那些帮助我解决问题的人.. :D 上帝保佑

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多