簡體   English   中英

DateTime可為空的異常作為參數

[英]DateTime nullable exception as a parameter

我有一個搜索表單,可以按幾個不同的字段進行搜索。 問題字段是birthDate。 在表格上是一個字符串。 在SQL 2005數據庫中,它是一個DateTime,可以為null。

下面的代碼是順序的,直到在窗體上聲明變量然后進行設置。 然后調用BLL,然后調用DAL。

在這行->

dgvSearchResults.DataSource =ConnectBLL.BLL.Person.Search(_firstName,_middleName,_lastName,_sSN, (DateTime)_birthDate,_applicationID,_applicationPersonID,_fuzzy);

我收到“可為空的對象必須具有值”錯誤。

我以為是因為我沒有提供Date參數,然后嘗試強制轉換為不可為null的DateTime。 正確?

我該怎么辦? 必須有一種解決方法。 Web應用程序版本上與此完全相同的BLL和DAL工作。

編輯1

需要注意的幾件事。 我對DateTime?有印象DateTime? Nullable<DateTime>正確嗎?

另外,我看不到如何為BirthDate這樣的字段輸入任意值。 我想我可以在業務層中構建一堆過濾器,但這似乎是“駭客”的方式。 也許不吧。 同樣,令我困擾的是,該程序的WebApp版本中的BirthDate字段中的相同BLL和DAL以及相同的DB允許為空。 有什么想法嗎? 對於那些沒有日期的條目,數據庫中具有空值

Search.cs

public DateTime? _birthDate;
_birthDate = null;
if (datBirthDate.Text != string.Empty)
    _birthDate = Convert.ToDateTime(datBirthDate.Text);
dgvSearchResults.DataSource=ConnectBLL.BLL.Person.Search(_firstName,_middleName,_lastName,_sSN, (DateTime)_birthDate,_applicationID,_applicationPersonID,_fuzzy);

ConnectBLL-> Person.vb

Public Shared Function Search(ByVal firstName As String, ByVal middleName As String, ByVal lastName As String, ByVal SSN As String, ByVal birthDate As Date, ByVal applicationId As Integer, ByVal applicationPersonId As String, ByVal fuzzy As Boolean) As Data.DataTable
Try
    Dim tbl As Data.DataTable = DAL.Connect.SearchPerson(firstName, middleName, lastName, SSN, birthDate, applicationId, applicationPersonId, fuzzy)

    If tbl.Rows.Count > 0 Then
        tbl.DefaultView.Sort = "Last Name ASC, First Name ASC, Middle Name ASC"
    End If
    Return tbl
Catch
    Throw
End Try

結束功能

ConnectDAL-> Connect.vb

Public Shared Function SearchPerson(ByVal _FirstName As String, ByVal _MiddleName As String, ByVal _LastName As String, ByVal _SSN As String, ByVal _BirthDate As Date, ByVal _ApplicationID As Integer, ByVal _ApplicationPersonID As String, ByVal _Fuzzy As Boolean) As Data.DataTable
Dim test As New clsSqlResponseTime
Dim dt As New Data.DataTable
Try
    Using cnn As New SqlClient.SqlConnection(ConnectROConnectionString)
        Dim cmd As New SqlClient.SqlCommand()
        cmd.Connection = cnn
        If _Fuzzy Then
            cmd.CommandText = strSearchPersonFuzzyStoredProcedure
        Else
            cmd.CommandText = strSearchPersonStoredProcedure
        End If
        cmd.CommandType = CommandType.StoredProcedure
        If Not IsNothing(_FirstName) Then cmd.Parameters.Add(New SqlClient.SqlParameter("@FirstName", _FirstName))
        If Not IsNothing(_MiddleName) Then cmd.Parameters.Add(New SqlClient.SqlParameter("@MiddleName", _MiddleName))
        If Not IsNothing(_LastName) Then cmd.Parameters.Add(New SqlClient.SqlParameter("@LastName", _LastName))
        If Not IsNothing(_SSN) Then cmd.Parameters.Add(New SqlClient.SqlParameter("@SSN", _SSN))
        If Not (_BirthDate = Date.MinValue) Then cmd.Parameters.Add(New SqlClient.SqlParameter("@BirthDate", _BirthDate))
        If Not IsNothing(_ApplicationPersonID) Then cmd.Parameters.Add(New SqlClient.SqlParameter("@ApplicationID", _ApplicationID))
        If Not IsNothing(_ApplicationPersonID) Then cmd.Parameters.Add(New SqlClient.SqlParameter("@ApplicationPersonID", _ApplicationPersonID))

        Dim da As New SqlClient.SqlDataAdapter(cmd)
        da.Fill(dt)
    End Using
Catch
    Throw
End Try
test.Log("SearchPerson", "Connect")
Return dt

結束功能

您可以執行以下操作:

dgvSearchResults.DataSource=ConnectBLL.BLL.Person.Search(_firstName,_middleName,_lastName,_sSN, _birthDate.HasValue ? _birthDate.Value : new DateTime() ,_applicationID,_applicationPersonID,_fuzzy);

基本上,如果為null,則將其默認設置為DateTime的默認設置(我相信它是1/1/0001)。

您似乎正在嘗試在此行上將可能的Null值轉換為Search.cs中的DateTime。

dgvSearchResults.DataSource = ConnectBLL.BLL.Person.Search(_firstName,_middleName,_lastName,_sSN,(DateTime)_birthDate,_applicationID,_applicationPersonID,_fuzzy);

那會導致這個錯誤。 如果字符串為空,則將null轉換為DateTime,否則它將被炸毀。 我建議您的Person.Search方法將Nullable <DateTime>作為參數並在那里處理null大小寫,或將其設置為DateTime.MinValue並將其在Person.Search中視為null。

在我看來,直到第三個函數將其添加到Parameters集合中,您才根本不使用birthDate值。 在第三個函數中,已經在添加Date.MinValue之前對其進行了測試。 只需將第一個功能更改為此:

public DateTime _birthDate;
if (string.IsNullOrEmpty(datBirthDate.Text))
    _birthDate = DateTime.MinValue;
else
    _birthDate = Convert.ToDateTime(datBirthDate.Text);
dgvSearchResults.DataSource=ConnectBLL.BLL.Person.Search(_firstName,_middleName,_lastName,_sSN,_birthDate,_applicationID,_applicationPersonID,_fuzzy);

這是最簡單的方法,但不一定是最正確的方法。 我將所有三個函數更改為使用Nullable DateTime,如下所示:

功能1

public DateTime? _birthDate = null;
if (!string.IsNullOrEmpty(datBirthDate.Text))
    _birthDate = Convert.ToDateTime(datBirthDate.Text);
dgvSearchResults.DataSource=ConnectBLL.BLL.Person.Search(_firstName,_middleName,_lastName,_sSN,_birthDate,_applicationID,_applicationPersonID,_fuzzy);

函數2和3的定義應類似於:

Public Shared Function Search(ByVal firstName As String, ByVal middleName As String, ByVal lastName As String, ByVal SSN As String, ByVal birthDate As Nullable(Of Date), ByVal applicationId As Integer, ByVal applicationPersonId As String, ByVal fuzzy As Boolean) As Data.DataTable

Public Shared Function SearchPerson(ByVal _FirstName As String, ByVal _MiddleName As String, ByVal _LastName As String, ByVal _SSN As String, ByVal _BirthDate As Nullable(Of Date), ByVal _ApplicationID As Integer, ByVal _ApplicationPersonID As String, ByVal _Fuzzy As Boolean) As Data.DataTable

以及函數3中使用birthDate的行:

If (_BirthDate.HasValue) Then cmd.Parameters.Add(New SqlClient.SqlParameter("@BirthDate", _BirthDate.Value))

為什么不將_birthDate設置為null,而不用某些DateTime值設置它? 這樣,它不能為null傳遞給BLL調用。 DateTime.MinValue或DateTime.Now都可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM