2010-09-06 4 views
1

У меня есть SQL таблицу со следующими столбцами:Отображение даты (C# WinForms)

PROFILE 
---------------------------------- 
Name | DateOfBirth | Address | ID 
---------------------------------- 
    |    |   | 
    |    |   | 

[Name] является обязательным полем, а ID является autoincrement колонки. Остальные поля не требуются.

Когда дело доходит до отображения информации пользователя в моей форме, поскольку поле DateOfBirth не требуется, я всегда получал это значение в своем текстовом поле 1900-01-01 00:00:00.000, даже если он не был указан при регистрации.

То, что я пытаюсь выполнить, - показать пустую строку в текстовом поле, если нет даты рождения.

С моим наивным образом мышления я написал метод, в котором он сначала проверяет столбец DateOfBirth, если он равен null, он возвращает пустую строку, иначе возвращает дату рождения в виде строки ex. txtDateOfBirth.Text = GetDateOfBirth(); , но всегда возвращает значение `1900-01-01 00: 00: 00.000 ', потому что поле в базе данных всегда вставляет это значение, даже если пользователь оставляет это поле пустым.

Можете ли вы мне помочь ... спасибо ...

Я также попытался это, но до сих пор не работают:

SELECT BIRTHDATE = CASE BIRTHDATE 
      WHEN CAST('1900-01-01' AS DATETIME) THEN '' 
      ELSE BIRTHDATE END 
FROM USER 
+1

Пожалуйста, пост код за 'GetDateOfBirth()', или его эквивалент. –

+0

Также, что вы видите в таблице, когда вы запрашиваете его напрямую (с учетом SQL Server, SQL Server Workbench)? 'ВЫБЕРИТЕ РОЖДЕНИЕ ОТ ПОЛЬЗОВАТЕЛЯ '. –

+0

OK sir ... какое-то время – yonan2236

ответ

0

Я получил его уже! :)

Вот мой исходный код:

protected void SaveUser() 
    { 
     SqlConnection conn = new SqlConnection(connectionString); 
     conn.Open(); 

     SqlCommand cmd = new SqlCommand("INSERT_USER"); 
     cmd.Parameters.Add(new SqlParameter("@NAME", txtName.Text.Trim())); 
     cmd.Parameters.Add(new SqlParameter("@ADDRESS", txtAddress.Text.Trim())); 
     cmd.Parameters.Add(new SqlParameter("@DATEOFBIRTH", txtDateOfBirth.Text.Trim())); 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.ExecuteNonQuery(); 
    } 

В моем исходном коде, даже если txtDateofBirth пуст, он всегда будет передать пустую строку в параметре вызывая базу данных для вставки «1900-01-01 00: 00: 00.00 ', а не значение NULL. Вот модифицированный код. Сначала проверю, если txtDateOfBirth не пуст (при условии, что введенное значение является допустимой датой), если значение true, добавьте cmd.Parameters.Add(new SqlParameter("@DATEOFBIRTH", txtDateOfBirth.Text.Trim())); в качестве параметра в INSERT_USER хранимую процедуру. Else, @DATEOFBIRTH параметр не создается и не передается вообще.

protected void SaveUser() 
{ 
    SqlConnection conn = new SqlConnection(connectionString); 
    conn.Open(); 

    SqlCommand cmd = new SqlCommand("INSERT_USER"); 
    cmd.Parameters.Add(new SqlParameter("@NAME", txtName.Text.Trim())); 
    cmd.Parameters.Add(new SqlParameter("@ADDRESS", txtAddress.Text.Trim())); 
    if(txtDateOfBirth.Text.Trim() != String.Empty) 
     { 
      cmd.Parameters.Add(new SqlParameter("@DATEOFBIRTH", txtDateOfBirth.Text.Trim())); 
     } 
    cmd.Connection = conn; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.ExecuteNonQuery(); 
} 

SP:

CREATE PROCEDURE [dbo].[INSERT_USER] 
(
    @NAME AS VARCHAR(25), 
    @ADDRESS AS VARCHAR(50) = NULL, 
    @DATEOFBIRTH AS DATETIME = NULL 
) 
AS 
BEGIN 
    INSERT INTO [USER] ([NAME], ADDRESS, DATEOFBIRTH) VALUES (@NAME, @ADDRESS, @DATEOFBIRTH) 
END 
1

Мои психические навыки отладки сказать мне, что вы по ошибке настройки дата рождения, когда вы вставляете строку. Хорошей проверкой является подключение профилировщика (один поставляется с SQL Server, если это то, что вы используете), и смотрите, что на самом деле встает при создании нового пользователя.

Проверьте код, который вставляет нового пользователя. Например, если вы используете DataSets, убедитесь, что у вас нет ограничения по умолчанию, установленного в столбце Birthdate (щелкните ячейку в конструкторе DataSet и проверьте сетку свойств).

Также возможно, что сама база данных имеет ограничение по умолчанию, установленное в этом столбце, но это менее вероятно.

+0

приватная строка ReturnDateOfBirth() { \t строка dateOfBirth = String.Empty; \t \t \t pl.ConnOpen(); pl.cmd = новый SqlCommand ("GET_DATEOFBIRTH", pl.MySQLConn); pl.cmd.Parameters.Add (новый SqlParameter ("@ ID", (объект) txtID.Text.Trim())); pl.cmd.CommandType = CommandType.StoredProcedure; pl.dr = pl.cmd.ExecuteReader(); если (pl.dr.HasRows) \t \t \t { \t \t \t \t DateOfBirth = pl.dr [ "DateOfBirth"] ToString(). \t \t \t} pl.MySQLConn.Close(); возвращение датыOfBirth; } – yonan2236

+0

@ yonan2236: Я на самом деле предлагаю, чтобы проблема была во вставке, а не в выборе. –

+0

Я также установил столбец DateOfBirth как Nullable и не имеет ограничений по умолчанию. но кажется, что он всегда вставляет '1900-01-01 00: 00: 00.000' – yonan2236

0

По какой причине вы не хотите этого делать?

string theDate = GetDateOfBirth().ToString(); 
txtDateOfBirth.Text = theDate == "1900-01-01 00:00:00.000" ? "" : theDate; 
+0

Хмм ... ОК, я попробую .. но что означает вторая линия? – yonan2236

+0

, если дата «1900-01-01 00: 00: 00.00», затем установите текст текстового поля, чтобы отобразить пустую строку, иначе отобразите theDate. http://msdn.microsoft.com/en-us/library/e4213hs1(VS.71).aspx –

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