2014-09-05 6 views
2

Я написал эту систему несколько лет назад и не пишу ни одного C# сейчас, поэтому для меня это похоже на ржавый. Я использую приведенный ниже код для записи новой записи. По какой-то причине, @TStamp иногда не написано правильно (SQL Server 12):UtcNow возвращает поврежденную временную метку

enter image description here

Как можно видеть, я получаю нули для временной части по случаю. Часто будет группа записей, происходящих от одного и того же веб-пользователя, но иногда это всего лишь отдельный инцидент. Проблема, безусловно, прерывистая и нечастая.

Мой вопрос: есть ли что-нибудь, что приведет к тому, что utcNow вернет отметку времени, которая выглядит так (то есть правильная дата, нулевое время)?

 protected void MessageDataSrc_Inserting(object sender, SqlDataSourceCommandEventArgs e) 
     { 
      e.Command.Parameters["@CoID"].Value = clsCompany.GetCompanyNumber(); 
      e.Command.Parameters["@TStamp"].Value = DateTime.UtcNow; 
      e.Command.Parameters["@Sender"].Value = clsUser.LoggedInUserName(); 
      e.Command.Parameters["@Message"].Value = MessageMemoBox.Value; 
      e.Command.Parameters["@Memo"].Value = ""; 
      e.Command.Parameters["@Receiver"].Value = ReceiverComboBox.Value; 
      e.Command.Parameters["@NoteCode"].Value = Int32.Parse(noteRadioButtons.SelectedValue); 
      e.Command.Parameters["@Urgent"].Value = cboxUrgent.Checked; 
      e.Command.Parameters["@Status"].Value = 1;   // new message status 
      . . . //unimportant stuff cut out 

      c = null; 
     } 

Редактировать

Единственный раз, когда это поле обновляется в системе, если пользователь редактирует деталь. Следующий код относится к этим обновлениям:

SelectCommandType="StoredProcedure"     
SelectCommand="usp_eSwitchBoard_SelectNewMsgs" 
DeleteCommand="DELETE FROM [Message] WHERE [CoID] = @CoID AND [ID] = @ID" 
UpdateCommand="UPDATE [Message] SET [TStamp] = @TStamp, [Sender] = @Sender, (...) WHERE [CoID] = @CoID AND [ID] = @ID" 
onselecting="MessageDataSrc_Selecting" onupdating="MessageDataSrc_Updating"> 
<DeleteParameters> 
    <asp:Parameter Name="CoID" Type="Int32" /> 
    <asp:Parameter Name="ID" Type="Int64" /> 
</DeleteParameters> 
<InsertParameters> 
    <asp:Parameter Name="CoID" Type="Int32" /> 
    <asp:Parameter Name="TStamp" Type="DateTime" /> 
    <asp:Parameter Name="Sender" Type="String" /> 

. , ,

РЕДАКТИРОВАТЬ # 2

Хранимые Px для выбора. Эта хранимая процедура не использовалась для выбора вышеприведенного вывода, однако она используется для предоставления пользователю выбора записей, доступных для редактирования. Поле проблемы ссылается в порядке, но все.

BEGIN 
    SET NOCOUNT ON; 
    SELECT M.*, U."NAME" AS "SenderName" FROM "Message" M, "User" U 
     WHERE M."CoID" = @COID AND "Receiver" = @RECEIVER AND 
      M."Status" = 1 AND 
      M."CoID" = U."CoID" AND M."Sender" = U."ID" 
       ORDER BY "TStamp" DESC 
END 

РЕДАКТИРОВАТЬ # 3

Источник MessageDataSrc_Updating

protected void MessageDataSrc_Updating(object sender, SqlDataSourceCommandEventArgs e) 
    { 
     e.Command.Parameters["@CoID"].Value = clsCompany.GetCompanyNumber(); 
     e.Command.Parameters["@Sender"].Value = clsUser.LoggedInUserName(); 
    } 
+0

Я не понимаю, почему это вернет это. Мне было бы любопытно, какой тип поля для TStamp в базе данных. Также у вас есть образец вставки SQL, который отправляется на сервер. Мне интересно, есть ли проблема с записью или хранением. –

+6

Похоже, что эти вставленные значения используют 'DateTime.UtcNow.Date' – Zer0

+0

Тип поля в базе данных - это дата и время. Кроме того, я использую следующее определение параметра вставки: RegularExpression

ответ

1

В способе MessageDataSrc_Updating, я не понимаю, включение параметра, используемого в @TStamp

UpdateCommand="UPDATE [Message] SET [TStamp] = @TStamp, [Sender] = @Sender, (...) WHERE [CoID] = @CoID AND [ID] = @ID" 

Не следует ли включать этот параметр в метод следующим образом?

protected void MessageDataSrc_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    e.Command.Parameters["@CoID"].Value = clsCompany.GetCompanyNumber(); 
    e.Command.Parameters["@Sender"].Value = clsUser.LoggedInUserName(); 

    e.Command.Parameters["@TStamp"].Value = DateTime.UtcNow; // Appears to be missing 
} 

Возможно ли, что это только обновленные записи с отметкой времени, установленного на текущую дату в полночь (эквивалент DateTime.UtcNow.Date) из-за значения по умолчанию установлен где-нибудь.

+0

Эта проблема теперь решена. Мы нашли сетку devexpress, которая делала обновление для записи в другом месте, о котором мы забыли. Он был установлен, как было предложено Zer0 и Michael выше, для обновления только с использованием «Date». Спасибо всем, кто ответил на эту проблему. – RegularExpression

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