2017-06-14 74 views
1

我有一個執行合併查詢從更新或插入DataGridView表中的值到SQL服務器數據庫表的值的問題。這裏是我下面的代碼,它並沒有給我任何錯誤或停工,但最近我注意到,它已經創造了我的數據庫表dbo.schedule包含所有NULL值甚至是關鍵的位置完全行,可以有人請幫助我嗎?我不是很熟悉,合併查詢在SQL所以請指出我的語法問題:從datagridview到數據庫合併查詢不執行sql,vb.net

Dim query As String = String.Empty 


query &= "DECLARE @TaskID nvarchar(8), @Task nvarchar(50), @Start_date datetime, @Due_date datetime, @Complete bit, @Task_Manager nvarchar(8), @JRID nvarchar(10), @Entered_By char(50), @Time_Entered datetime;" 
query &= "MERGE INTO schedule USING (VALUES (@TaskID, @Task, @start_date, @Due_Date, @Complete, @Task_Manager, @JRID, @Entered_By, @Time_Entered)) AS t(TaskID, Task, start_date, Due_Date, Complete, Task_Manager, JRID, Entered_By, Time_Entered) " 
query &= "ON schedule.TaskID = @TaskID WHEN MATCHED THEN" 
query &= " UPDATE SET schedule.TaskID = t.TaskID, schedule.Task=t.Task, schedule.start_date=t.start_date, schedule.due_date=t.due_date, schedule.complete=t.complete, schedule.task_manager=t.task_manager, " 
query &= "schedule.JRID=t.JRID, schedule.Entered_by=t.Entered_by, schedule.Time_Entered=t.Time_Entered" 
query &= " WHEN NOT MATCHED THEN INSERT (TaskID, Task, start_date, Due_Date, Complete, Task_Manager, JRID, Entered_By, Time_Entered)" 
query &= " VALUES (@TaskID, @Task, @start_date, @Due_Date, @Complete, @Task_Manager, @JRID, @Entered_By, @Time_Entered);" 


Using conn As New SqlConnection(dbLocations(0, 1)) 
    Using comm As New SqlCommand() 
     With comm 
      For Each row As DataGridViewRow In MainSchedule.DataGridView1.Rows 
       If Not (row.Cells(0).Value = Nothing) Then 
        .Parameters.Clear() 
        .Connection = conn 
        .CommandType = CommandType.Text 
        .CommandText = query 
        insertcommand.Parameters.AddWithValue("@TaskID", TNn) 
        insertcommand.Parameters.AddWithValue("@Complete", "False") 
        insertcommand.Parameters.AddWithValue("@Task", row.Cells(0).Value) 
        insertcommand.Parameters.AddWithValue("@Start_date", row.Cells(1).Value) 
        insertcommand.Parameters.AddWithValue("@Due_Date", row.Cells(2).Value) 
        insertcommand.Parameters.AddWithValue("@JRID", txtJRID.Text) 
        insertcommand.Parameters.AddWithValue("@Task_Manager", row.Cells(3).Value) 
        insertcommand.Parameters.AddWithValue("@Entered_By", GetUserName()) 
        insertcommand.Parameters.AddWithValue("@Time_Entered", Now) 
        NextTask() 
       End If 
      Next 
     End With 
     conn.Open() 
     comm.ExecuteNonQuery() 
    End Using 
End Using 

回答

1

我想通了的情況下,任何人想知道,這是我的新代碼:

Connexion.Open() 
       Dim query As String = String.Empty 
       Dim keypos = 0 

       query &= "UPDATE schedule SET Task = @Task, Complete = @Complete, Start_date = @Start_date, " 
       query &= "Due_date = @Due_date, JRID = @JRID, Task_Manager = @Task_Manager, Entered_By = @Entered_By, Time_Entered = @Time_Entered " 
       query &= "WHERE TaskID = @TaskID " 
       query &= "IF @@ROWCOUNT = 0 INSERT INTO schedule (TaskID, Task, start_date, Due_Date, Complete, Task_Manager, JRID, Entered_By, Time_Entered)" 
       query &= " VALUES (@TaskID, @Task, @start_date, @Due_Date, @Complete, @Task_Manager, @JRID, @Entered_By, @Time_Entered);" 

       For Each row As DataGridViewRow In MainSchedule.DataGridView1.Rows 
        If Not (row.Cells(0).Value = Nothing) Then 
         insertcommand.Parameters.Clear() 
         insertcommand.CommandText = query 
         insertcommand.Parameters.AddWithValue("@TaskID", row.Cells(0).Value) 
         insertcommand.Parameters.AddWithValue("@Complete", "False") 
         insertcommand.Parameters.AddWithValue("@Task", row.Cells(1).Value) 
         insertcommand.Parameters.AddWithValue("@Start_date", row.Cells(2).Value) 
         insertcommand.Parameters.AddWithValue("@Due_Date", row.Cells(3).Value) 
         insertcommand.Parameters.AddWithValue("@JRID", txtJRID.Text) 
         insertcommand.Parameters.AddWithValue("@Task_Manager", row.Cells(4).Value) 
         insertcommand.Parameters.AddWithValue("@Entered_By", GetUserName()) 
         insertcommand.Parameters.AddWithValue("@Time_Entered", Now) 
         insertcommand.ExecuteNonQuery() 
        End If 
        keypos = keypos + 1 
       Next 

       Connexion.Close()