【发布时间】:2009-05-08 19:15:49
【问题描述】:
我有一个搜索表单,可以按几个不同的字段进行搜索。问题字段是birthDate。在表单上它是一个字符串。在 SQL 2005 db 中,它是一个可以为空的 DateTime。
就在表单上声明变量然后设置它而言,下面的代码是连续的。然后调用 BLL,然后调用 DAL。
在这一行 -->
dgvSearchResults.DataSource =ConnectBLL.BLL.Person.Search(_firstName,_middleName,_lastName,_sSN, (DateTime)_birthDate,_applicationID,_applicationPersonID,_fuzzy);
我收到 “可空对象必须有值” 错误。
我假设是因为我没有提供 Date 参数,然后尝试将其转换为不可为空的 DateTime。对吗?
我能做些什么呢?必须有办法解决它。这完全相同的 BLL 和 DAL 也适用于网络应用版本。
编辑 1
有几点需要注意。我的印象是DateTime?和Nullable<DateTime>是一样的,对吗?
另外,我不知道如何为 BirthDate 之类的字段输入任意值。我想我可以在我的业务层中构建一堆过滤器,但这似乎是“Hack”方式。也许不吧。此外,同样的 BLL 和 DAL 与同一个 DB 允许在该程序的 WebApp 版本的 BirthDate 字段中为空值,这让我感到困扰。有什么想法吗?对于那些没有日期的条目,数据库中有 null。
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
结束函数
【问题讨论】:
标签: c# vb.net winforms parameters null