正如标题所述,我目前正试图将数据库中的值存储在列表中。在SSMS中,我已经验证了我的查询拉我需要的数据,但是当涉及到vb.net并将这些值放入列表时,它似乎是失败的。下面我已经复制了我目前正在使用的代码。
Try
Dim sb As New StringBuilder
With sb
.Append("SELECT TypeID FROM EnrollmentType AS a ")
.Append("INNER JOIN Enrollment AS e ON a.TypeDescription = e.EnrollmentType ")
.Append("WHERE AccountNumber = @AccountNumber")
End With
Using connEType As New SqlConnection(ConfigurationManager.ConnectionStrings("Blah").ToString)
Using cmdEType As New SqlCommand(sb.ToString, connEType)
cmdEType.Parameters.AddWithValue("@AccountNumber", strgAccountNum)
connEType.Open()
Using sdrEType As SqlDataReader = cmdEType.ExecuteReader
If sdrEType.HasRows Then
While sdrEType.Read
For i = 0 To dtEType.Rows.Count - 1
listEType.Add(dtEType.Rows(i).Item("TypeID"))
Next
End While
End If
End Using
connEType.Close()
End Using
End Using
lblSKUDescription.Text = dtEType.Rows.Count
Catch ex As Exception
Throw ex
lblSKUDescription.Text = "Oops"
End Try
即使在SSMS我的查询工作,这里没有添加到列表中,我的数据表没有数据行。这段代码目前处于页面加载事件中,因为我想要尽快填充这个列表,我不知道这是否重要。我还会注意到,在页面加载事件中还有另一个sql连接,但是我已经更改了任何可能冲突的变量名称,我不知道这是否重要,但我觉得我会提到它。
如果我需要提供更多的信息,我可以。
您的主要问题是您实际上没有使用sdrEType
阅读器,相反,您只是使用尚未加载的dtEType
数据表。目前尚不清楚为什么需要For
循环。
- 您应该使用多行字符串,而不是
StringBuilder
,这样更清楚。 Catch
没有意义,因为Throw ex
擦除堆栈跟踪,并且不运行下面的行。你应该把它去掉。如果你真的需要Catch
,使用Throw
而不是Throw ex
If sdrEType.HasRows
是不必要的,While
会解决的。connEType.Close()
是不必要的,Using
会做。- 明确指定参数类型和长度
- 用表别名/前缀限定SQL中的每个列。
Dim query As String = "
SELECT a.TypeID
FROM EnrollmentType AS a
INNER JOIN Enrollment AS e ON a.TypeDescription = e.EnrollmentType
WHERE e.AccountNumber = @AccountNumber;
"
Using connEType As New SqlConnection(ConfigurationManager.ConnectionStrings("Blah").ToString)
Using cmdEType As New SqlCommand(query, connEType)
cmdEType.Parameters.Add("@AccountNumber", SqlDbType.VarChar, 100).Value = strgAccountNum
connEType.Open()
Using sdrEType As SqlDataReader = cmdEType.ExecuteReader
While sdrEType.Read
listEType.Add(sdrEType("TypeID"))
End While
End Using
End Using
End Using
lblSKUDescription.Text = dtEType.Rows.Count