2014-03-30 3 views
0

새로운 데이터를 잘 삽입하는 comboBox가 있습니다. 그러나 기존의 특정 데이터를 선택하면 업데이트되지 않습니다. 미친 insertUpdate 메서드를 작성하려고했지만 운이 없었습니다. 어떤 도움을 주시면 감사하겠습니다. 여기 내 C#이 있습니다 :C#/SQL 테이블에 새 항목이 표시되지 않습니다.

if (updateDataButton.Checked == true) 
        { 
         using (System.Data.SqlClient.SqlConnection objCon2 = 
         new System.Data.SqlClient.SqlConnection("Data Source=.; Initial Catalog=EmployeeProjects; Integrated Security=TRUE")) 
         { 

          using (System.Data.SqlClient.SqlCommand objCmd2 = 
           new System.Data.SqlClient.SqlCommand("pUpdEmployeeProjectHours", objCon2)) 
          { 
           objCmd2.CommandType = CommandType.StoredProcedure; 
           objCmd2.Parameters.AddWithValue("@EmployeeName", EmployeeNameBox.Text); 

           insertUpdates(); 

           objCmd2.Parameters.AddWithValue("@ProjectName", ProjectNameBox.Text); 
           objCmd2.Parameters.AddWithValue("@Date", DateTime.Parse(DateTimeBox.Text)); 
           objCmd2.Parameters.AddWithValue("@Hours", HoursBox.Text); 

           try 
           { 

            objCon2.Open(); 

            objCmd2.ExecuteNonQuery(); 
            System.Data.SqlClient.SqlDataAdapter da2 
        = new System.Data.SqlClient.SqlDataAdapter("Select * From EmployeeProjectHours", objCon2); 



           } 
           catch 
           { 
            throw; 
           } 
           finally 
           { 

            objCon2.Close(); 

           } 
          } 
         } 
        } 

       } 
    private void insertUpdates() 
    {//.ToString() 
     if (EmployeeNameBox.SelectedText == "Bob Smith") 
     { 
      using (System.Data.SqlClient.SqlConnection objCon = 
       new System.Data.SqlClient.SqlConnection("Data Source=.; Initial Catalog=EmployeeProjects; Integrated Security=TRUE")) 
      { 

       using (System.Data.SqlClient.SqlCommand objCmd = 
        new System.Data.SqlClient.SqlCommand("pUpdEmployeeNames", objCon)) 
       { 

        objCmd.CommandType = CommandType.StoredProcedure; 

        objCmd.Parameters.AddWithValue("@EmployeeId", 1); 
        objCmd.Parameters.AddWithValue("@EmployeeName", EmployeeNameBox.Text); 



        try 
        { 
         objCon.Open(); 
         objCmd.ExecuteNonQuery(); 
         System.Data.SqlClient.SqlDataAdapter da4 
       = new System.Data.SqlClient.SqlDataAdapter("Select * From EmployeeProjectHours", objCon); 



        } 
        catch 
        { 
         throw; 
        } 
        finally 
        { 

         objCon.Close(); 
        } 
       } 
      } 
     } 


     else 
      if (EmployeeNameBox.SelectedText == "Sue Jones") 
      { 
       { 
        using (System.Data.SqlClient.SqlConnection objCon2 = 
         new System.Data.SqlClient.SqlConnection("Data Source=.; Initial Catalog=EmployeeProjects; Integrated Security=TRUE")) 
        { 

         using (System.Data.SqlClient.SqlCommand objCmd2 = 
          new System.Data.SqlClient.SqlCommand("pUpdEmployeeNames", objCon2)) 
         { 

          objCmd2.CommandType = CommandType.StoredProcedure; 


           objCmd2.Parameters.AddWithValue("@EmployeeId", 2); 
           objCmd2.Parameters.AddWithValue("@EmployeeName", EmployeeNameBox.Text); 



          try 
          { 
           objCon2.Open(); 
           objCmd2.ExecuteNonQuery(); 
           System.Data.SqlClient.SqlDataAdapter da5 
         = new System.Data.SqlClient.SqlDataAdapter("Select * From EmployeeProjectHours", objCon2); 



          } 
          catch 
          { 
           throw; 
          } 
          finally 
          { 

           objCon2.Close(); 
          } 
         } 
        } 
       } 
      } 
    } 

여기에 쿼리가 있습니다.

Set NoCount On -- Turns off the annoying "One Row affected" messages 
-- Note: Do not place the Set NoCount On option inside a Stored Procedure, since it 
-- will send a false error to an ADO.NET DataAdpater object. 

-- 1) Make the databse 
USE [master] 
GO 
If Exists(Select Name from master.Sys.databases where name = 'EmployeeProjects') 
Begin 
    ALTER DATABASE [EmployeeProjects] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
    Drop Database[EmployeeProjects] 
End 
GO 

CREATE DATABASE [EmployeeProjects] 
GO 

USE [EmployeeProjects] 
GO 

-- 2) Make the tables 
CREATE TABLE [dbo].[Employees] 
(
    [EmployeeId] [int] NOT NULL PRIMARY KEY , 
    [EmployeeName] [varchar](100) NOT NULL, 
) 
GO 

CREATE TABLE [dbo].[Projects] 
(
    [ProjectId] [int] NOT NULL PRIMARY KEY, 
    [ProjectName] [varchar](100) NOT NULL, 
    [ProjectDescription] [varchar](5000) NOT NULL, 
) 
GO 

CREATE TABLE [dbo].[EmployeeProjectHours] 
(
    [EmployeeId] [int] NOT NULL, 
    [ProjectId] [int] NOT NULL, 
    [Date] [datetime] NOT NULL, 
    [Hours] [decimal](18, 2) NOT NULL, 
    CONSTRAINT [PK_EmployeeProjectHours] PRIMARY KEY CLUSTERED 
     ([EmployeeId] ASC,[ProjectId] ASC,[Date] ASC) 
) 
GO 

CREATE TABLE [dbo].[ThisYearsDates] 
(
    [DateId] [int] Identity NOT NULL PRIMARY KEY, 
    [DateName] [varchar](100) NOT NULL, 
) 
GO 

CREATE TABLE [dbo].[ValidHourEntries] 
(
    [TimePeriodId] [int] Identity NOT NULL PRIMARY KEY, 
    [TimePeriod] [varchar](100) NOT NULL, 
) 
GO 

-- 3) Fill the tables with test data 
-- Add two test employees 
Insert into [dbo].[Employees] Values (1, 'Bob Smith') 
Insert into [dbo].[Employees] Values (2, 'Sue Jones') 
GO 
-- Add two test Projects 
Insert into [dbo].[Projects] Values (100, 'Accounting DB Upgrade', 'Upgrade the Accounting Database to our new SQL 2008 Server') 
Insert into [dbo].[Projects] Values (101, 'Accounting Application Upgrade', 'Modify our existing Accounting Application to connect to the new upgraded server') 
GO 
-- Add four test Employee Project Hours 
Insert into [dbo].[EmployeeProjectHours] Values (1,100,'1/1/' + Cast(Year(Getdate()) as varchar(4)), 6) 
Insert into [dbo].[EmployeeProjectHours] Values (1,100,'1/2/' + Cast(Year(Getdate()) as varchar(4)), 4) 
Insert into [dbo].[EmployeeProjectHours] Values (2,101,'1/1/' + Cast(Year(Getdate()) as varchar(4)), 5.5) 
Insert into [dbo].[EmployeeProjectHours] Values (2,101,'1/2/' + Cast(Year(Getdate()) as varchar(4)), 6) 
GO 

-- Add This years dates 
Declare @DateId int = 1 
Declare @Date datetime = '1/1/' + Cast(Year(GetDate()) as Varchar(4)); 
While (Year(@Date) < (Year(GetDate()) + 1)) 
    Begin 
     Insert into [dbo].[ThisYearsDates]Values(Convert(varchar(50), @Date, 101)) 
     Set @DateId = @DateId + 1 
     Set @Date = DateAdd(dd, 1, @Date) 
    End 
GO 

-- Add Valid Hourly Entries 
Declare @TimePeriod decimal(18,2) = 0 
While (@TimePeriod <= 24) 
    Begin 
     Insert into [ValidHourEntries](TimePeriod) Values (@TimePeriod) 
     Set @TimePeriod = @TimePeriod + .25 
    End 
Go 

-- 4) Review everything you have so far 
Select * From [dbo].[Employees] 
Select * From [dbo].[Projects] 
Select * From [dbo].[EmployeeProjectHours] 
Select * From [dbo].[ThisYearsDates] 
Select * From [dbo].[ValidHourEntries] 
GO 


-- 5) Create Select Sprocs for Tables 
Create Proc pSelEmployeeNames 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Select 
      EmployeeName 
     From [dbo].[Employees] 
     Set @RC = 100 -- Indicates Success 
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
    End Catch 
    Return @RC 
    End 
GO 

Create Proc pSelProjectNames 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Select 
      ProjectName 
     From [dbo].[Projects] 
     Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
    End Catch 
    Return @RC 
    End 
GO 

Create Proc pSelEmployeeProjectHours 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     SELECT 
      dbo.EmployeeProjectHours.Date, 
      dbo.Employees.EmployeeName, 
      dbo.Projects.ProjectName, 
      dbo.EmployeeProjectHours.Hours 
     FROM dbo.EmployeeProjectHours 
     INNER JOIN dbo.Employees 
      ON dbo.EmployeeProjectHours.EmployeeId = dbo.Employees.EmployeeId 
     INNER JOIN dbo.Projects 
      ON dbo.EmployeeProjectHours.ProjectId = dbo.Projects.ProjectId 
    Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
    End Catch 
    Return @RC 
    End  
GO 

Create Proc pSelThisYearsDates 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     SELECT 
     [DateId] 
     ,[DateName] 
     FROM [ThisYearsDates] 
     Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
    End Catch 
    Return @RC 
    End 
GO 


Create Proc pSelValidHours 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Select 
     TimePeriodId, 
     TimePeriod 
     From ValidHourEntries 
     Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
    End Catch 
    Return @RC 
    End 
GO 


    -- 5a) Review everything you have so far 
Exec pSelEmployeeNames 
Exec pSelProjectNames 
Exec pSelEmployeeProjectHours 
Exec pSelThisYearsDates 
Exec pSelValidHours 
GO 


-- 6) Insert Sprocs 
Create Proc pInsEmployeeNames 
(@EmployeeId int, @EmployeeName varchar(100)) 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Begin Transaction 
     Insert into [dbo].[Employees] Values (@EmployeeId,@EmployeeName) 
     Commit Transaction 
    Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
     Rollback Transaction    
    End Catch 
    Return @RC 
    End 
GO 

Create Proc pInsProjectNames 
(@ProjectId int, @ProjectName varchar(100), @ProjectDescription varchar(5000)) 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Begin Transaction  
     Insert into [dbo].[Projects] Values (@ProjectId, @ProjectName, @ProjectDescription) 
     Commit Transaction 
    Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
     Rollback Transaction    
    End Catch 
    Return @RC 
    End 
GO 

Create Proc pInsEmployeeProjectHours 
(@EmployeeName varchar(100), @ProjectName varchar(100), @Date datetime, @Hours decimal(18,2)) 
    AS 
    Begin 
    Declare @RC int = 0, @EmployeeId Int = 0, @ProjectId int = 0  
    Begin Try 
     -- Look up the IDs 

     Select @EmployeeId = EmployeeId From dbo.Employees Where EmployeeName = @EmployeeName 
     Select @ProjectId = ProjectId From dbo.Projects Where ProjectName = @ProjectName  
     Begin Transaction   
     Insert into [dbo].[EmployeeProjectHours] Values(@EmployeeId, @ProjectId, @Date, @Hours) 
     Commit Transaction   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
     Rollback Transaction   
    End Catch 
    Return @RC 
    End 
GO 

    -- 6a) Review everything you have so far 
Exec pInsEmployeeNames @EmployeeId = 3 , @EmployeeName = 'Test User' 
Exec pInsProjectNames @ProjectId = 103, @ProjectName = 'Test Project' , @ProjectDescription = 'Test Desc' 
Exec pInsEmployeeProjectHours @EmployeeName = 'Test User', @ProjectName = 'Test Project', @Date = '1/1/2011', @Hours = 1 
GO 

Exec pSelEmployeeNames 
Exec pSelProjectNames 
Exec pSelEmployeeProjectHours 
GO 


-- 7) Update Sprocs 
Create Proc pUpdEmployeeNames 
(@EmployeeId int, @EmployeeName varchar(100)) 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Begin Transaction 
     Update [dbo].[Employees] 
     Set 
      [EmployeeId] = @EmployeeId, 
      [EmployeeName] = @EmployeeName 
     Where 
      [EmployeeId] = @EmployeeId 
      OR 
      [EmployeeName] = @EmployeeName 
     Commit Transaction 
    Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
     Rollback Transaction 
    End Catch 
    Return @RC 
    End 
GO 

Create Proc pUpdProjectNames 
(@ProjectId int, @ProjectName varchar(100), @ProjectDescription varchar(5000)) 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Begin Transaction  
     Update [dbo].[Projects] 
     Set 
      [ProjectId] = @ProjectId, 
      [ProjectName] = @ProjectName, 
      [ProjectDescription] = @ProjectDescription   
     Where 
      [ProjectId] = @ProjectId 
      OR 
      [ProjectName] = @ProjectName 
      OR  
      [ProjectDescription] = @ProjectDescription   
     Commit Transaction 
    Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
     Rollback Transaction   
    End Catch 
    Return @RC 
    End 
GO 

Create Proc pUpdEmployeeProjectHours 
(@EmployeeName varchar(100), @ProjectName varchar(100), @Date datetime, @Hours decimal(18,2)) 
    AS 
    Begin 
    Declare @RC int = 0, @EmployeeId Int = 0, @ProjectId int = 0 
    Begin Try 
     -- Look up the IDs 
     Select @EmployeeId = EmployeeId From dbo.Employees Where EmployeeName = @EmployeeName 
     Select @ProjectId = ProjectId From dbo.Projects Where ProjectName = @ProjectName  

     Begin Transaction 
     Update [dbo].[EmployeeProjectHours] 
     Set 
      [EmployeeId] = @EmployeeId, 
      [ProjectId] = @ProjectId, 
      [Date] = @Date, 
      [Hours]= @Hours    
     Where 
      [EmployeeId] = @EmployeeId 
      AND 
      [ProjectId] = @ProjectId 
      AND 
      [Date] = @Date 
     Commit Transaction   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
     Rollback Transaction    
    End Catch 
    Return @RC 
    End 
GO 

    -- 7a) Review everything you have so far 
    Exec pUpdEmployeeNames @EmployeeId = 3 , @EmployeeName = 'Test User 2' 
    Exec pUpdProjectNames @ProjectId = 103, @ProjectName = 'Test Project 2' , @ProjectDescription = 'Test Desc 2' 
    Exec pUpdEmployeeProjectHours @EmployeeName = 'Test User 2',@ProjectName = 'Test Project 2' , @Date = '1/1/2011' , @Hours = 10 
    GO 

    Exec pSelEmployeeNames 
    Exec pSelProjectNames 
    Exec pSelEmployeeProjectHours 
    GO 

-- 8) Delete Sprocs 
Create Proc pDelEmployeeNames 
(@EmployeeId int = -1, @EmployeeName varchar(100) = '') 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Begin Transaction 
     Delete From [dbo].[Employees] 
     Where 
      [EmployeeId] = @EmployeeId 
      OR 
      [EmployeeName] = @EmployeeName 
     Commit Transaction 
    Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
    End Catch 
    Return @RC 
    End 
GO 

Create Proc pDelProjectNames 
(@ProjectId int = -1, @ProjectName varchar(100) = '', @ProjectDescription varchar(5000) = '') 
    AS 
    Begin 
    Declare @RC int = 0 
    Begin Try 
     Begin Transaction  
     Delete From [dbo].[Projects] 
     Where 
      [ProjectId] = @ProjectId 
      OR 
      [ProjectName] = @ProjectName 
      OR  
      [ProjectDescription] = @ProjectDescription   
     Commit Transaction 
    Set @RC = 100 -- Indicates Success   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
    End Catch 
    Return @RC 
    End 
GO 

Create Proc pDelEmployeeProjectHours 
(@EmployeeName varchar(100), @ProjectName varchar(100), @Date datetime) 
    AS 
    Begin 
    Declare @RC int = 0, @EmployeeId Int = 0, @ProjectId int = 0 

    -- Look up the IDs 
    Select @EmployeeId = EmployeeId From dbo.Employees Where EmployeeName = @EmployeeName 
    Select @ProjectId = ProjectId From dbo.Projects Where ProjectName = @ProjectName  

    Begin Try  
     Begin Transaction  
     Delete From [dbo].[EmployeeProjectHours] 
     Where 
      [EmployeeId] = @EmployeeId 
      AND 
      [ProjectId] = @ProjectId 
      AND 
      [Date] = @Date 
     Commit Transaction   
    End Try 
    Begin Catch 
     Set @RC = -100 --Indicates Error 
    End Catch 
    Return @RC 
    End 
GO 

    -- 8a) Review everything you have so far 
    Exec pDelEmployeeNames @EmployeeId = 3 , @EmployeeName = 'Test User 2' 
    Exec pDelProjectNames @ProjectId = 103, @ProjectName = 'Test Project 2' , @ProjectDescription = 'Test Desc 2' 
    Exec pDelEmployeeProjectHours @EmployeeName = 'Test User 2' , @ProjectName = 'Test Project 2', @Date = '1/1/2011' 
    GO 

    Exec pSelEmployeeNames 
    Exec pSelProjectNames 
    Exec pSelEmployeeProjectHours 
    GO 

답변

0

EmployeeId 필드를 Auto Increment로 설정해야합니다. EmployeeId가 필요한 경우 SCOPE_IDENTITY를 사용하십시오.

CREATE TABLE (
    EmployeeId INT IDENTITY PRIMARY KEY, 
    ... 
); 
+0

@Albendini 귀하는 내 대답을 거부하고 내 대답을 사용하도록 질문과 코드를 변경 한 다음 질문을 변경했습니다. 쿨하지 않아. 또한 업데이트 할 때 발생하는 오류를 게시 한 경우 도움이 필요할 수도 있습니다. – DJTN

+0

죄송합니다. 이 사이트의 작동 방식을 잘 모릅니다. 나는 당신의 대답을 받아들이면 그것이 질문을 끝낼 것이라고 생각했습니다. 나는 당신의 대답을 정말로 이해하지 못했습니다. 그리고 그것은 아마도 C#이나 SQL에 관한 첫 번째 것을 모르기 때문일 것입니다. 따라서 C#으로 코드화하거나 comboBox 속성을 변경하여 지침을 얻으려고했습니다. 하지만 나는 C#에 SQL 코드를 추가하는 방법을 아직 모르고있다. 다시 미안 해요. – monkeyBus

+0

No Problem, 내가 작성한 코드는 테이블 작성을 위해 제시 한 쿼리와 같은 SQL 코드입니다. ID 필드에 키워드 IDENTITY를 사용하면 SQL은 새 Employee 레코드를 추가 할 때 EmployeeId 필드 데이터를 자동으로 삽입합니다. 이 ID를 사용하여 데이터를 다시 가져옵니다. – DJTN

관련 문제