繁体   English   中英

无法更新此表,SQL Server数据库C#应用程序

[英]Couldn't get this table updated, SQL Server database C# application

我创建了3个表:

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

我试图根据“ Clients和“ Employees相关列向EmpJobs插入/更新数据( Hours_SpentJob_Date )。

这是我的代码

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上没有显示任何错误,但是当我检查数据库时,没有任何数据没有插入表中。 有什么问题?

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

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)。不要忘记最后一个分号。

您实际上不应该在表之间重复值(Client_Name,Emp_Name)。 我建议在http://www.drsql.org/Pages/Presentations.aspx上查阅路易斯戴维森关于数据库设计的幻灯片。

可以选择合并,也可以选择upsert。 https://samsaffron.com/blog/archive/2007/04/04/14.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;";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM