我试图制作一个在文件夹中显示图片的程序。 每张图片的路径都存储在数据库中。 我的问题是它只显示存储在数据库中的最后图像而不是所有图片。
代码是:
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Try
Dim ctr As Integer = 0
Dim pic As String
Dim sqlconn As New SqlConnection("data source=NMPI_2;initial catalog=IPCS; " & _
"password=rhyatco; " & _
"persist security info=True; " & _
"user id= rhyatco;" & _
"packet size=4096")
sqlconn.Open()
Dim query As String = "Select picture from Bpicture"
Dim sqlcomm As New SqlCommand(query, sqlconn)
Dim reader As SqlDataReader
reader = sqlcomm.ExecuteReader
While reader.Read
pic = reader("picture").ToString
Me.PictureBox1.Image = Image.FromFile(pic)
Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
End While
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
答案 0 :(得分:2)
它总是会显示最后一张图像,因为您正在检索整个表并使用While循环检索所有记录。最后一张图片永远是赢家。
有两种可能的解决方案:
一个,从数据库中随机检索一个图像。检查此stackoverflow thread有关如何随机选择行的信息。这个解决方案的警告是你每次都要调用数据库。
两个,从数据库中检索所有图像,将数据存储在一个集合中,然后从集合中随机选择一个图像。使用此解决方案的警告是,可能有太多图像存储在内存中的集合中,在这种情况下,您必须使用One。
答案 1 :(得分:0)
我看到你提供的问题就是你每次定时器触发时都在运行查询并迭代结果集中的所有行。
我认为你真正想要的是在表单加载时下载结果集一次,然后在计时器上切换你正在查看的图片。
一次又一次地遍历它们的一种方法是下载列表并将它们填充到文件名队列中,然后在计时器上执行类似这样的操作(抱歉,我的示例是在C#中):
string fileName = imageFileNameQueue.Dequeue();
PictureBox1.Image = Image.FromFile(fileName);
imageFileNameQueue.Enqueue (fileName); // Put the file back at the back of the queue
答案 2 :(得分:-2)
对现有解决方案进行简单的更改将会有一定的可能性突破while循环。该解决方案的一个问题是查询结果中的图像比早期图像更不可能显示。
我没有做任何VB,所以我是通过Google编码的,但你需要在某处创建一个Random实例:
Dim rand as new Random()
然后在你的while循环中,拉出一个随机数,看看你是否应该停止:
While reader.Read
...
If rand.Next(10) > 8 Then
Exit While
End If
End While
编辑:您还应该移动代码,将图像和SizeMode设置为while循环,这样一旦您决定使用图像,它们就只会设置一次。