Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入的SQL输出_C#_Sql_Asp.net - Fatal编程技术网

C# 插入的SQL输出

C# 插入的SQL输出,c#,sql,asp.net,C#,Sql,Asp.net,我在一个页面上有两个按钮,一个记录开始时间,一个记录结束时间 “开始时间”按钮执行sql插入。 此时,我需要抓取主键create。为此,我想使用sql命令(插入输出) 然后,当单击停止时间时,应该使用where子句中的主键从开始使用停止时间更新行。 我相信insertsql是正确的,但我不知道如何将主键传递给下一个命令 代码转储,与我到目前为止 var command1 = "INSERT INTO [Time] ([Start Time], [Work Order]) OUTPUT INSER

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

“开始时间”按钮执行sql插入。 此时,我需要抓取主键create。为此,我想使用sql命令(插入输出)

然后,当单击停止时间时,应该使用where子句中的主键从开始使用停止时间更新行。 我相信insertsql是正确的,但我不知道如何将主键传递给下一个命令

代码转储,与我到目前为止

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();
    }
}

不是让它转到标签,而是让它转到一个int,然后用int设置标签文本。然后在第二部分传递int。但是,将int声明在using语句的范围之外,否则它将被释放,当您稍后尝试调用它时,您将得到一个null引用异常

编辑:要添加,如果您转换为存储过程并定义SqlParameter对象(您没有它们,您将需要它们),这会更好


为什么不使用存储过程??在存储过程中,您可以轻松地执行此操作
cmd.Parameters.AddWithValue(“@PrimaryKey”,PrimaryKey from INSERT output
绝对不是一种很好的方法。`创建一个存储过程,学习如何使用
SqlParameter
以及如何使用
ParameterDirection。output
在存储过程中执行此操作,并在存储过程中分配您的输出参数=选择范围_标识()因为pkI以前从来没有做过存储过程,所以我先尝试了不同的事情。我只是在空闲时间编写代码。在我这样做之前,我想看看是否还有其他我更习惯的方法。@Itomship你能标记答案以便在类似的问题中引用吗?我想你在插入到返回新插入的PrimaryKey,他应该使用如下内容
SqlParameter outputKeyId=new-SqlParameter(“@PrimaryKey”,SqlDbType.Int);outputKeyId.Direction=ParameterDirection.Output;
我建议创建一个存储过程并将其中一个参数设置为Output…@DJKRAZE是的,我也会执行存储过程并定义方向-但这个问题在我看来似乎是一个基本的逻辑流问题。我还补充了一点。
alykins
我同意这个操作这里出现了多个问题正如我上面所说,我以前从未做过存储过程工作,所以我正在尝试我习惯的方法。听起来我需要做一个存储过程,所以我将开始尝试。谢谢。现在是学习新技术的最好时机。扩展你的思维,尝试跳出框框思考
    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();
        }
    }