2014-09-19 71 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