0

我试图制作一个在文件夹中显示图片的程序。每张图片的路径都存储在数据库中。我的问题是它只显示存储在数据库中的最后一张图片,而不是所有图片。

代码是:

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
4

3 回答 3

2

它总是会显示最后一个图像,因为您正在检索整个表并使用 While 循环检索所有记录。最后一张图片永远是赢家。

有两种可能的解决方案:

,从数据库中随机检索一张图像。检查这个stackoverflow线程如何随机选择一行。此解决方案的警告是您每次都调用数据库。

,从数据库中检索所有图像,将数据存储在集合中,并从集合中随机选择一张图像。此解决方案的警告是,可能有太多图像无法存储在内存中的集合中,在这种情况下,您必须使用 One。

于 2009-02-11T07:04:47.563 回答
0

好吧,我看到您提供的问题是您正在运行查询并在每次计时器触发时遍历结果集中的所有行。

我认为您真正想要的是在表单加载时下载一次结果集,然后在计时器上切换您正在查看的图片。

一遍又一遍地轮换它们的一种方法是下载列表并将它们填充到文件名队列中,然后在计时器上执行以下操作(抱歉,我的示例是在 C# 中):

string fileName = imageFileNameQueue.Dequeue();
PictureBox1.Image = Image.FromFile(fileName);
imageFileNameQueue.Enqueue (fileName); // Put the file back at the back of the queue
于 2009-02-11T07:08:06.400 回答
-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

编辑:您还应该移动代码以将 Image 和 SizeMode 设置出 while 循环,以便在您决定图像后只设置一次。

于 2009-02-11T07:22:40.937 回答