2015-02-24 4 views
1

Хорошо, поэтому я разобрал разницу дат, она отлично работает. Проблема, с которой я столкнулся сейчас, заключается в том, что когда я нажимаю на date из календаря (календарь AJAX, который появляется, когда вы нажимаете на TextBox), он добавляет Date вместе с null time в базу данных. Я хочу только Date не Time.
Обращаем ваше внимание: что DataType из AdmitDate и DischargeDate установлено в datetime.Получение даты только вместо даты и времени

Вот мой C# код:

string str = "update Patient set Department= @Department,[email protected],[email protected],[email protected],AdmitDate[email protected],[email protected], [email protected] where PID = '" + TextBox3.Text + "'"; 
     cmd = new SqlCommand(str, con); 
     con.Open(); 
     cmd.Parameters.AddWithValue("@Department", DropDownList4.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@Ward", DropDownList3.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@Bed", DropDownList1.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@Status", DropDownList2.SelectedItem.Text); 
     cmd.Parameters.AddWithValue("@AdmitDate", TextBox1.Text); 
     DateTime AdmitDate = DateTime.Parse(TextBox1.Text); 
     // AdmitDate.ToString("d"); 
     AdmitDate.ToShortDateString(); 
     cmd.Parameters.AddWithValue("@DischargeDate", TextBox2.Text); 
     DateTime DischargeDate = DateTime.Parse(TextBox2.Text); 
     // DischargeDate.ToString("d"); 
     DischargeDate.ToShortDateString(); 
     var diff = (DischargeDate - AdmitDate).Days; 
     cmd.Parameters.AddWithValue("@NumOfDays", diff); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 

Как вы можете видеть, я попробовал 2 метода, они не дают какой-либо ошибки, но не работают так, как они должны. Я пробовал и другие вещи (упомянутые здесь и на других сайтах), но они тоже не работали. Любая помощь будет оценена по достоинству. Дополнительная информация: Я использую SQL Server 2008 R2 с VS2013.

EDIT: вот моя SQL структура таблицы:

CREATE TABLE [dbo].[Patient] (
[PID]   INT   IDENTITY (1, 1) NOT NULL, 
[Department] NVARCHAR (50) NULL, 
[Ward]   NVARCHAR (50) NULL, 
[Bed]   NVARCHAR (50) NULL, 
[Status]  NVARCHAR (50) NULL, 
[AdmitDate]  DATETIME  NULL, 
[DischargeDate] DATETIME  NULL, 
[NumOfDays]  INT   NULL, 
CONSTRAINT [PK__Patient__C57755200BC6C43E] PRIMARY KEY CLUSTERED ([PID] ASC) 

я извлекал поля, которые не имеют отношения.

EDIT: мой GridView код:

<div id="mbody"> <br /> 
       <div class="gview"> 
         <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" HeaderStyle-HorizontalAlign="Center" FooterStyle-HorizontalAlign="Center" CssClass="gview" DataKeyNames="PID" Width="613px"> 
          <Columns> 
           <asp:CommandField ShowDeleteButton="True" /> 
           <asp:BoundField DataField="PID" HeaderText="PID" SortExpression="PID" InsertVisible="False" ReadOnly="True" /> 
           <asp:BoundField DataField="Pname" HeaderText="Pname" SortExpression="Pname" /> 
           <asp:BoundField DataField="Gender" HeaderText="Gender" SortExpression="Gender" /> 
           <asp:BoundField DataField="Department" HeaderText="Department" SortExpression="Department" /> 
           <asp:BoundField DataField="Ward" HeaderText="Ward" SortExpression="Ward" /> 
           <asp:BoundField DataField="Bed" HeaderText="Bed" SortExpression="Bed" /> 
           <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status" /> 
           <asp:BoundField DataField="AdmitDate" HeaderText="AdmitDate" SortExpression="AdmitDate" /> 
           <asp:BoundField DataField="DischargeDate" HeaderText="DischargeDate" SortExpression="DischargeDate" /> 
           <asp:BoundField DataField="NumOfDays" HeaderText="NumOfDays" SortExpression="NumOfDays" /> 
          </Columns> 

     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SMCConnectionString %>" SelectCommand="SELECT [PID], [Pname], [Gender], [Department], [Ward], [Bed], [Status], [AdmitDate], [DischargeDate], [NumOfDays] FROM [Patient]" DeleteCommand="DELETE FROM [Patient] WHERE [PID] = @PID" InsertCommand="INSERT INTO [Patient] ([Pname], [Gender], [Department], [Ward], [Bed], [Status], [AdmitDate], [DischargeDate], [NumOfDays]) VALUES (@Pname, @Gender, @Department, @Ward, @Bed, @Status, @AdmitDate, @DischargeDate, @NumOfDays)" UpdateCommand="UPDATE [Patient] SET [Pname] = @Pname, [Gender] = @Gender, [Department] = @Department, [Ward] = @Ward, [Bed] = @Bed, [Status] = @Status, [AdmitDate] = @AdmitDate, [DischargeDate] = @DischargeDate, [NumOfDays] = @NumOfDays WHERE [PID] = @PID"> 
          <DeleteParameters> 
           <asp:Parameter Name="PID" Type="Int32" /> 
          </DeleteParameters> 
          <InsertParameters> 
           <asp:Parameter Name="Pname" Type="String" /> 
           <asp:Parameter Name="Gender" Type="String" /> 
           <asp:Parameter Name="Department" Type="String" /> 
           <asp:Parameter Name="Ward" Type="String" /> 
           <asp:Parameter Name="Bed" Type="String" /> 
           <asp:Parameter Name="Status" Type="String" /> 
           <asp:Parameter Name="AdmitDate" Type="DateTime" /> 
           <asp:Parameter Name="DischargeDate" Type="DateTime" /> 
           <asp:Parameter Name="NumOfDays" Type="Int32" /> 
          </InsertParameters> 
          <UpdateParameters> 
           <asp:Parameter Name="Pname" Type="String" /> 
           <asp:Parameter Name="Gender" Type="String" /> 
           <asp:Parameter Name="Department" Type="String" /> 
           <asp:Parameter Name="Ward" Type="String" /> 
           <asp:Parameter Name="Bed" Type="String" /> 
           <asp:Parameter Name="Status" Type="String" /> 
           <asp:Parameter Name="AdmitDate" Type="DateTime" /> 
           <asp:Parameter Name="DischargeDate" Type="DateTime" /> 
           <asp:Parameter Name="NumOfDays" Type="Int32" /> 
           <asp:Parameter Name="PID" Type="Int32" /> 
          </UpdateParameters> 
        </asp:SqlDataSource> 

      </div> 
+0

AdmitDate.ToShortDateString() не присваивается переменной. – failedprogramming

+0

Почему тип данных - это datetime вместо Date? Если вы укажете дату и время как тип данных, поведение будет правильным. – Amit

+0

aaaaa Позвольте мне попробовать summin, спасибо за руководство. –

ответ

2

Из того, что я понимаю, что вы хотите, чтобы накопить только часть даты из datetime вы можете сделать это ниже:

DateTime AdmitDate = DateTime.Parse(TextBox1.Text); 
    cmd.Parameters.AddWithValue("@AdmitDate", AdmitDate.ToShortDateString()); 
    DateTime DischargeDate = DateTime.Parse(TextBox2.Text); 
    cmd.Parameters.AddWithValue("@DischargeDate", DischargeDate.ToShortDateString()); 

В вашем коде вы не назначаете значение ToShortDateString() для чего-либо, поэтому изменения не отражаются.

И вы можете изменить свой запрос, чтобы использовать его значения parametrized, чтобы избежать инъекции SQL. Here is more info on it

string str = "update Patient set Department = @Department, Ward = @Ward, Bed = @Bed, Status = @Status, AdmitDate = @AdmitDate, DischargeDate = @DischargeDate, NumOfDays = @NumOfDays where PID = @PID"; 
cmd.Parameters.AddWithValue("@PID", TextBox3.Text); 

UPDATE

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

ИЛИ

Если у вас есть полный контроль над столами, и вы никогда не хотите, чтобы сохранить время, то окончательное решение будет изменить DateTime к Date.

В этом случае, когда вы его извлечете, и если вы сохраните его в переменной типа DateTime, он добавит к нему часть Time. Таким образом, вы должны применить .ToShortDateString() перед назначением его в пользовательский интерфейс.

UPDATE

Чтобы изменить пользовательский интерфейс, что нужно поставить DataformatString свойство boundfield из столбцов дат. В вашем GridView для этих 2-х линий добавить DataformatString свойство со значением {0:MM/dd/yyyy}

<asp:BoundField DataField="AdmitDate" HeaderText="AdmitDate" SortExpression="AdmitDate" DataFormatString="{0:MM/dd/yyyy}"/> 
    <asp:BoundField DataField="DischargeDate" HeaderText="DischargeDate" SortExpression="DischargeDate" DataFormatString="{0:MM/dd/yyyy}"/> 
+0

спасибо, это то, что я получаю. Я не думаю, что он используется где-то еще.[link] (http://prntscr.com/694z16) –

+0

Вы устанавливаете '' @AdmitDate '' несколько раз. Вот почему ошибка. –

+0

все еще работает нормально, исправлена ​​ошибка, но это то, как я получаю ее: [link] (http://prntscr.com/695263) –

0

Если вы хотите только часть даты будет храниться в БД, то используйте тип данных столбца в качестве даты.

Например -

DECLARE @date1 date= '02-24-15 23:20:51'; -- will take only the date 
SELECT @date1 AS 'date1' 

Придётся -

date1 
-------------- 
2015-02-24 

Edit-

Из вашего издания и структуры таблицы я побежал простой тест, и он работает нормально.

CREATE TABLE #Patient (
[PID]   INT   IDENTITY (1, 1) NOT NULL, 
[Department] NVARCHAR (50) NULL, 
[Ward]   NVARCHAR (50) NULL, 
[Bed]   NVARCHAR (50) NULL, 
[Status]  NVARCHAR (50) NULL, 
[AdmitDate]  Date  NULL, 
[DischargeDate] Date  NULL, 
[NumOfDays]  INT   NULL 
); 

Insert into #Patient Values('ABC','Ward1','Bed2','Active','02-24-15 23:20:51','02-26-15 23:20:51',2); 

Select * from #Patient; 

конечные результаты

PID   Department           Ward            Bed            Status            AdmitDate DischargeDate NumOfDays 
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------- ------------- ----------- 
1   ABC            Ward1            Bed2            Active            2015-02-24 2015-02-26 2 

Если вы проверяете я изменил тип данных даты и времени на сегодняшний день

[AdmitDate]  Date  NULL, 
    [DischargeDate] Date  NULL, 
+0

Почему это не работает для меня тогда –

+0

Тип данных для структуры, которую вы поделили, - это дата и время. Измените его на сегодняшний день, изменив таблицу. Кроме того, вы подключены к правильному SQL Server и БД? Кроме того, используйте Date.TryParseExact вместо Date.Parse. – Amit

+0

nope, все равно то же самое :( –

0

Accordimg к:

тип данных AdmitDate и DischargeDate устанавливается к дате.

Вы не можете вставить только дату-часть в этот столбец. Если вы попытались, она автоматически сохранит время как 12:00 AM (начальное время дня).

Если вы действительно хотите вставить только дату, то измените тип данных столбца на дату.

ALTER TABLE table_name 
ALTER COLUMN column_name datatype 

См: Alter_Table_datatype

+0

Я пробовал, что . Он по-прежнему дает Time часть –

+0

в качестве значения даты в столбце даты @ Sana Qureshi –

+0

да, это то, что он делает @user –

0

DateTime AdmitDate = DateTime.Parse (TextBox1.Text);

строка admitDate = AdmitDate.Date; // он дает вам только дату

Если вы хотите, то только дата в SQL SERVER означает, что вам необходимо изменить тип данных столбца с datetime на сегодняшний день.

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