我创建了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_Spent
和Job_Date
中的相关列,将数据(EmpJobs
,Clients
)插入/更新到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上没有显示任何错误,但是当我检查数据库时,没有任何数据没有插入到表中。有什么问题?
答案 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;";