2014-09-19 2 views
0

У меня есть две кнопки на странице, одна из которых регистрирует время начала и время, в которое записывается время окончания.SQL Output Inserted

Кнопка времени начала выполняет вкладку 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

почему вы не используете хранимые процедуры ?? в хранимых процедурах вы можете легко это сделать –

+1

'cmd.Parameters.AddWithValue (« @ PrimaryKey », PrimaryKey из вывода INSERT « определенно не очень хороший подход к этому ». Создайте хранимую процедуру и узнайте, как использовать' SqlParameter' и как использовать 'ParameterDirection.Output' сделать это в Хранимой процедуре, а в Хранимой процедуре назначить ваш OutPut Param = SELECT SCOPE_IDENTITY() AS pk – MethodMan

+0

Я никогда не делал хранимую процедуру до того, чтобы сначала попробовать разные вещи. в мое свободное время. До того, как я это сделал, я хотел, чтобы я увидел, есть ли другой способ, которым я больше привык. – Itomship

ответ

1

вместо того, чтобы его перейти на метку, перейдите к int, а затем установите текст метки с помощью int. Затем передайте int на вторую часть. Объявите int вне области использования операторов using, хотя они будут удалены, и вы получите исключение с нулевой ссылкой, когда вы попытаетесь позвонить позже.

Редактировать: Чтобы добавить это, было бы лучше, если бы вы конвертировали в сохраненные proc и определяли объекты 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

Я думаю, что вы вводя в заблуждение OP после вставки, чтобы вернуть вновь вставленный PrimaryKey, он должен использовать что-то вроде этого 'SqlParam eter outputKeyId = новый SqlParameter ("@ PrimaryKey", SqlDbType.Int); outputKeyId.Direction = ParameterDirection.Output; 'Я бы предложил создать хранимую процедуру и установить один из Params в OutPut ... – MethodMan

+0

@DJKRAZE Да, я бы сделал хранимую процедуру и определил направления тоже, но этот вопрос казался я должен быть основным вопросом логического потока. Я также упомянул об этом. – alykins

+0

'alykins' Я согласен, что у op есть несколько проблем, которые происходят здесь – MethodMan

Смежные вопросы