【问题标题】:SQL Output Inserted插入的 SQL 输出
【发布时间】:2014-09-19 15:58:28
【问题描述】:

我在一个页面上有两个按钮,一个记录开始时间,一个记录结束时间。

开始时间按钮执行 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();
    }
}

【问题讨论】:

  • 为什么不使用存储过程??在存储过程中,您可以轻松做到这一点
  • cmd.Parameters.AddWithValue("@PrimaryKey", PrimaryKey from INSERT output 绝对不是这样做的好方法。` 创建一个存储过程并学习如何使用 SqlParameter 以及如何使用 ParameterDirection.Output 在存储过程中使用存储程序分配您的 OutPut Param = SELECT SCOPE_IDENTITY() AS pk
  • 我以前从未做过存储过程,所以我先尝试不同的东西。我只是在空闲时间编码。在我这样做之前,我想看看是否有另一种我更习惯的方式。
  • @Itomship 您能否标记答案,以便在类似问题中引用?

标签: c# sql asp.net


【解决方案1】:

而不是将其转到标签,而是将其转到 int,然后使用 int 设置标签文本。然后在第二部分传递 int 。但是在 using 语句的范围之外声明 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();
        }
    }

【讨论】:

  • 我认为你在插入后误导了 OP 以返回新插入的 PrimaryKey 他应该使用类似 SqlParameter outputKeyId = new SqlParameter("@PrimaryKey", SqlDbType.Int); outputKeyId.Direction = ParameterDirection.Output; 我建议创建一个存储过程并将其中一个参数设置为 OutPut ...
  • @DJKRAZE 是的,我也会执行存储过程并定义方向——但在我看来,这个问题似乎是一个基本的逻辑流程问题。我还提到了它。
  • alykins 我同意这个操作在这里有多个问题
  • 正如我上面所说的,我以前从未做过存储过程工作,所以我正在尝试我习惯的方法。听起来我需要做一个存储过程,所以我会开始尝试谢谢。
  • 嗯,没有比现在更好的时间来学习新技术了。扩展你的思维,尝试跳出框框思考
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2011-04-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多