无法更新此表,SQL Server数据库C#application

时间:2016-11-28 21:01:57

标签: c# sql sql-server

我创建了3个表:

  • Clients:Client_ID,Client_Name,Client_Status,
  • Employees:Emp_ID,Emp_Name,Emp_Role
  • EmpJobs:Emp_ID,Emp_Name,Client_ID,Client_Name,Hours_Spent,Job_Date

我正在尝试根据Hours_SpentJob_Date中的相关列,将数据(EmpJobsClients)插入/更新到Employees

这是我的代码

string constring = "Data Source=baker-pc;Initial Catalog=BakodahDB;Integrated Security=True"; 
string sqlQuery = "UPDATE EmpJobs SET Hours_Spent=@Hours_Spent, Job_Date =@Job_Date" +
                  " WHERE Client_Name=@Client_Name AND Emp_Name=@Emp_Name";

SqlConnection conDataBase = new SqlConnection(constring);
SqlCommand sqlCommand = new SqlCommand(sqlQuery, conDataBase);

conDataBase.Open();

sqlCommand.CommandText = sqlQuery;
sqlCommand.Parameters.Add("@Hours_Spent",SqlDbType.Int).Value = comboBox3.SelectedItem;
sqlCommand.Parameters.Add("@Job_Date",SqlDbType.Date).Value = Convert.ToDateTime(dateTimePicker1.Text);
sqlCommand.Parameters.Add("@Client_Name",SqlDbType.VarChar).Value = comboBox1.SelectedItem;
sqlCommand.Parameters.Add("@Emp_Name",SqlDbType.VarChar).Value = comboBox2.SelectedItem;

sqlCommand.ExecuteNonQuery();
conDataBase.Close();

MessageBox.Show("Saved!");

它在Visual Studio上没有显示任何错误,但是当我检查数据库时,没有任何数据没有插入到表中。有什么问题?

2 个答案:

答案 0 :(得分:1)

如果您不知道该ClientName和EmployeeName是否存在记录,并且您想要INSERT(如果该记录不存在)或UPDATE(如果该记录存​​在),那么您可以使用单个T-SQL语句叫MERGE

string sqlQuery = @"MERGE EmpJobs T
                 USING (SELECT @Client_Name AS CName, @Emp_Name As EName) as S 
                 ON T.Client_Name = S.CName AND T.Emp_Name = S.EName
                 WHEN NOT MATCHED THEN INSERT 
                      (Hours_Spent, Job_Date) VALUES (@Hours_Spent, @Job_Date)
                 WHEN MATCHED THEN UPDATE 
                      SET Hours_Spent=@Hours_Spent, Job_Date =@Job_Date;";

合并命令后跟目标表名称及其别名(EmpJobs T),然后使用搜索记录存在所需的两个参数构建伪记录。此伪记录与目标表匹配。 此时,如果找到匹配项(UPDATE SET ....),则可以编写要使用的语句(INSERT .... VALUES)不要忘记最后的分号。

答案 1 :(得分:1)

你真的不应该跨表重复值(Client_Name,Emp_Name)。我建议在COFF查看Louis Davidson关于数据库设计的幻灯片。

合并是一个选项,或者你可以使用upsert。 http://www.drsql.org/Pages/Presentations.aspx

那就是说,这样的事情可能有用:

string sqlQuery = @"
declare @Client_ID int;
declare @Emp_ID    int;

select @Client_ID = Client_ID from dbo.Clients c   where c.Client_Name = @Client_Name;
select @Emp_ID    = Emp_ID    from dbo.Employees e where e.Emp_Name    = @Emp_Name;

begin tran;
if exists (select 1 from dbo.EmpJobs j with (updlock,serializable) where j.Client_ID=@Client_ID and j.Emp_ID=@Emp_ID)
  begin;
    update dbo.EmpJobs set 
        Hours_Spent = @Hours_Spent
      , Job_Date    = @Job_Date
      where Client_ID = @Client_ID and Emp_ID=@Emp_ID;
    end;
  else begin;
    insert into dbo.EmpJobs (Emp_ID, Emp_Name, Client_ID, Client_Name, Hours_Spent, Job_Date)
      select @Emp_ID, @Emp_Name, @Client_ID, @Client_Name, @Hours_Spent, @Job_Date;
    end;
    commit tran;";