2017-08-29 51 views
0

我很难运行此代码,我有两个选择语句在一个单一的查询与不同的“声明”,我想要的只是将其插入数据库只是“ID”只有这里是代码,如何从单个查询中的两个不同的select语句获取ID?

  sqc.Open(); 
      cmd = sqc.CreateCommand(); 
      cmd.CommandText = "Select DepID from UserDept where Department [email protected] and Position [email protected] union all Select SalaryID from Salaries where Gradenumber [email protected] and StepNumber [email protected]"; 
      cmd.Parameters.AddWithValue("@depe", cmbDept.SelectedItem.ToString()); 
      cmd.Parameters.AddWithValue("@posi", cmbPos.SelectedItem.ToString()); 
      cmd.Parameters.AddWithValue("@gn", cmbgrade.SelectedItem.ToString()); 
      cmd.Parameters.AddWithValue("@sn", cmbstep.SelectedItem.ToString()); 
      sda = new SqlDataAdapter(cmd); 
      dt = new DataTable(); 
      sda.Fill(dt); 
      foreach (DataRow rr in dt.Rows) 
      { 
       cmd = sqc.CreateCommand(); 
       cmd.CommandText = "insert into UserInfo2 (AccountID,DeptID,SalaryGrade,DateEmp,DateHired) Values (@idd,@dep,@sal,@emp,@hired)"; 
       cmd.Parameters.AddWithValue("@idd", "crap"); 
       cmd.Parameters.AddWithValue("@dep", rr[0].ToString()); 
       cmd.Parameters.AddWithValue("@sal", rr[1].ToString()); 
       cmd.Parameters.AddWithValue("@emp", dtpEmployed.Value.ToShortDateString()); 
       cmd.Parameters.AddWithValue("@hired", dtpPromoted.Value.ToShortDateString()); 
       cmd.ExecuteNonQuery(); 
       MessageBox.Show("Information successfully saved!", "Information!", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 

      sqc.Close(); 

什么即时试图做的是,如果列名DEPID子项目必须dep232和SALARYID是SAL 232

我尝试在INSERT语句

   cmd.Parameters.AddWithValue("@dep", rr[0].ToString()); 
       cmd.Parameters.AddWithValue("@sal", rr[0].ToString()); 

这段代码的输出是列名DEPID它有子项sal243,它应该只有SALARYID 并且还有另一个DEPID是dep243的数据,但salaryID也有dep243。

+0

你到底想做什么?两张桌子之间没有联系。这样你最终会搞乱第三张表中的所有数据。 – Shahbaz

回答

0

好了,你有2个查询,他们给你的部门ID和工资等级。如果这两个查询中的任何一个只返回一行,那么你可以这样做脱身:

 cmd.CommandText = @"select * from 
(
Select DepID 
from UserDept 
where Department [email protected] and Position [email protected] 
) a cross join 
(
Select SalaryID 
from Salaries 
where Gradenumber [email protected] and StepNumber [email protected] 
) b"; 

字符串开头的@可以让它运行多行,方便格式化和使sql更容易阅读。

如果两个查询都返回多行,请不要这样做。你必须将两个表内联在一起。在你的问题中没有足够的信息来确定如何去做;表格之间的关系并不明显

有很好的理由避免使用AddWithValue,但这是一篇博文(您可以搜索它),而不是我可以在这里输入一行。尽管如此你基本上都会调用所有组合选定项目的字符串,而不会真正考虑数据库中数据的类型。如果在数据库中,像gradenumber这样的东西存储为数字,至少应该调用addwithvalue并传递一个数值(即Convert.ToInt32(combo.selecteditem))而不是字符串(您当前的.ToString() ing方法)

+0

它返回两行,但第一行的工资和部门ID具有相同的ID为sal243,第二行也具有相同的项目(dep243)在列(工资&dep) 我真正想要发生的事情是给我一行,如果它的DEPID项只应该是dep243,而对于salaryID则应该是sal243。 –

+0

您将需要修改您的查询,以便获得的行数是您想要的行数。如果你想要一行,我会和243返回两次,这是因为两行匹配你的where子句。修改where子句,只有一行匹配。做选择*将有助于 –

+0

是的,这是我的问题ahaha。你可以为我做或给我一个提示吗? –

相关问题