我创建了3个表
Clients: Client_ID, Client_Name, Client_Status,
Employees:Emp_ID, Emp_Name, Emp_Role
EmpJobs:EmpJob_ID, Emp_ID, Client_ID, Hours_Spent, Job_Date
现在我需要一个功能,用户根据Client_Name和Emp_Name向EmpJobs输入数据(Hours_Spent,Job_Date)。这就是我试过的
string constring = "Data Source=baker-pc;Initial Catalog=BakodahDB;Integrated Security=True";
string sqlQuery = (@"INSERT INTO EmpJobs (Hours_Spent, Job_Date)
values (@Hours_Spent,@Job_Date)
INNER JOIN Clients
ON EmpJobs.Client_ID=Clients.Client_ID
INNER JOIN Employees
ON EmpJobs.Emp_ID=Employees.Emp_ID
WHERE Clients.Client_Name=@Client_Name AND Employees.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!");
我做错了什么?什么是正确的方法呢?
答案 0 :(得分:2)
如果您确实要插入新行,那么您需要INSERT . . . SELECT
。它看起来像这样:
INSERT INTO EmpJobs (Emp_ID, Client_ID, Hours_Spent, Job_Date)
SELECT e.Emp_ID, c.Client_ID, @Hours_Spent, @Job_Date
FROM Clients c JOIN
Employees e
ON c.Client_Name = @Client_Name AND e.Emp_Name = @Emp_Name;
答案 1 :(得分:0)
编写一个Select Query,从Name返回Emp_ID
和Client_ID
,然后将该查询作为insert查询的值传递。
(@"INSERT INTO EmpJobs (Emp_ID, Client_ID, Hours_Spent, Job_Date)
values
((Select Emp_ID, Client_ID from Employees, Clients
INNER JOIN Clients
ON EmpJobs.Client_ID=Clients.Client_ID
INNER JOIN Employees
ON EmpJobs.Emp_ID=Employees.Emp_ID
WHERE Clients.Client_Name=@Client_Name AND Employees.Emp_Name=@Emp_Name"),
(@Hours_Spent,@Job_Date)));
注意:此查询只是一个可能不起作用的示例。但它是提出想法或一瞥它应该如何运作的想法。
答案 2 :(得分:0)
你不能在这样的条件下使用insert / update。 而不是这个,创建一个存储过程并将4个参数传递给存储过程。
在存储过程中,您可以创建逻辑。
注意:我指的是正确的做法。
CREATE PROCEDURE [dbo].[PRocname] (
@Client_Name nvarchar(your choice of length),
@Emp_Name nvarchar(your choice of length),
@HOurs_spent int,
@Job_date datetime)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ClientID INT ;
DECLARE @EmpID INT ;
SET @ClientID = SELECT Client_ID from Clients where client_name =@Client_Name;
SET @EmpID = SELECT Emp_ID from Employees where Emp_Name =@Emp_Name;
INSERT INTO EMPJobs(Emp_ID, Client_ID, Hours_Spent, Job_Date)
VALUES (
@EmpID, @ClientID,@Hours_spent,@Job_Date
)
END
GO