2014-09-19 107 views
0

我在頁面上有兩個按鈕,一個記錄開始時間,一個記錄結束時間。已插入SQL輸出

起始時間按鈕執行SQL插入件。 在這一點上,我需要抓住創建的主鍵。爲此,我想使用sql命令(輸出插入)。

然後單擊停止時間時,該行應使用從一開始的主鍵在where子句中與停止時間更新。 我相信插入SQL是正確的,但我不知道如何將主鍵傳遞給下一個命令。

代碼轉儲,與我到目前爲止。

var command1 = "INSERT INTO [Time] ([Start Time], [Work Order]) OUTPUT INSERTED.PrimaryKey VALUES (@StartTime, @Work_Order)"; 
using (SqlConnection cnn1 = new SqlConnection(cnnString)) 
{ 
    using (SqlCommand cmd1 = new SqlCommand(command1, cnn1)) 
    { 
     cmd1.Parameters.AddWithValue("@StartTime", SqlDbType.DateTime).Value = System.DateTime.Now; 
     cmd1.Parameters.AddWithValue("@Work_Order", SqlDbType.Int).Value = e.CommandArgument; 
     cnn1.Open(); 
     Label1.Text = cmd1.ExecuteScalar().ToString(); 
     cnn1.Close(); 
    } 
} 

var command = "UPDATE [Time] SET [Stop Time] = @StopTime WHERE [PrimaryKey] = @PrimaryKey"; 
using (SqlConnection cnn = new SqlConnection(cnnString)) 
{ 
    using (SqlCommand cmd = new SqlCommand(command, cnn)) 
    { 
     cmd.Parameters.AddWithValue("@StopTime", SqlDbType.DateTime).Value = System.DateTime.Now; 
     cmd.Parameters.AddWithValue("@PrimaryKey", *PrimaryKey from INSERT output* 

     cnn.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
} 
+2

你爲什麼不使用存儲過程?在存儲過程中,你可以從INSERT輸出 '絕對不是一個好方法做this.'創建一個存儲過程,並學習如何使用'SqlParameter'做到這一點很容易 – 2014-09-19 16:06:27

+1

'cmd.Parameters.AddWithValue(「@的PrimaryKey」的PrimaryKey和如何在存儲過程中使用'ParameterDirection.Output'在存儲過程中做到這一點與您指定輸出參數= SELECT SCOPE_IDENTITY()AS PK – MethodMan 2014-09-19 16:10:14

+0

之前,所以我第一次嘗試不同的東西。我只是代碼,我從來沒有做過一個存儲過程在我的空閒時間。之前,我做這樣的說法,我是我想看看是否有另一種方式我比較習慣了。 – Itomship 2014-09-19 16:57:07

回答

1

而不是讓它去標籤讓它去int,然後用int設置標籤文本。然後在第二部分傳遞int。在int聲明的範圍之外聲明int,否則它將被丟棄,當你稍後嘗試並調用它時,你會得到一個空引用異常。

編輯:要添加,這將是更好,如果你轉換爲存儲的特效和定義的SqlParameter對象(你沒有他們,你會需要它們)。

SqlParameter

int myPK; 
    var command1 = "INSERT INTO [Time] ([Start Time], [Work Order]) OUTPUT INSERTED.PrimaryKey VALUES (@StartTime, @Work_Order)"; 
    using (SqlConnection cnn1 = new SqlConnection(cnnString)) 
    { 
     using (SqlCommand cmd1 = new SqlCommand(command1, cnn1)) 
     { 
      cmd1.Parameters.AddWithValue("@StartTime", SqlDbType.DateTime).Value = System.DateTime.Now; 
      cmd1.Parameters.AddWithValue("@Work_Order", SqlDbType.Int).Value = e.CommandArgument; 
      cnn1.Open(); 
      myPk = Convert.ToInt32(cmd1.ExecuteScalar()); 
      Label1.Text = myPk.ToString(); 
      cnn1.Close(); 
     } 
    } 

    var command = "UPDATE [Time] SET [Stop Time] = @StopTime WHERE [PrimaryKey] = @PrimaryKey"; 
    using (SqlConnection cnn = new SqlConnection(cnnString)) 
    { 
     using (SqlCommand cmd = new SqlCommand(command, cnn)) 
     { 
      cmd.Parameters.AddWithValue("@StopTime", SqlDbType.DateTime).Value = System.DateTime.Now; 
      cmd.Parameters.AddWithValue("@PrimaryKey", myPK); 

      FindControl("Work_OrderLabel"); ; 

      cnn.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
+0

我認爲你是在Insert之後誤導OP以返回新插入的PrimaryKey時,他應該使用類似這樣的東西 'SqlParam eter outputKeyId = new SqlParameter(「@ PrimaryKey」,SqlDbType.Int); outputKeyId.Direction = ParameterDirection.Output;'我會建議創建一個存儲過程,並將其中一個參數設置爲OutPut ... – MethodMan 2014-09-19 16:07:58

+0

@DJKRAZE是的,我會執行存儲過程並定義方向 - 但這個問題似乎我是一個基本的邏輯流程問題。我還補充說。 – alykins 2014-09-19 16:19:49

+0

'alykins'我同意op有多個問題在這裏進行 – MethodMan 2014-09-19 16:35:57