none
求助孟老师,操作IMAGE类型的数据表超时问题 RRS feed

  • 问题

  • 有个插入图片到数据库的程序,有时候执行可以正常通过,有时会报下面的错误:

     cmd.ExecuteScalar()
    执行10次会有8次报错:

    “/”应用程序中的服务器错误。

    超时时间已到。在操作完成之前超时时间已过或服务器未响应。
    语句已终止。

     

    行 660:    cmd.Parameters.Add("@FileData", Data.SqlDbType.Image).Value = Filedata
    行 661:    CNs.Open()
    行 662:    cmd.ExecuteNonQuery()
    行 663:   End Using
    行 664:  End Using

     

    问题应该问题在数据库上,因为,我测试过,把SQL语句改成另外一个数据表的操作就一切正常,10次操作10次成功。以下是代码:

    '获得上传的文件,并读取到FileData
    Dim UpFile = FileUpload1
    Dim FileLength As Integer = UpFile.PostedFile.ContentLength
    Dim FileData(FileLength) As Byte
    FileStream.Read(FileData, 0, FileLength)
    FileStream.Dispose()

    Dim ConnectionString AS String = "Server=.;Database=TTT;uid=User;pwd=123456;"

    Dim Connections As New SqlConnection(ConnectionString)
    Dim Commands As New SqlCommand()

    If Connections.State = ConnectionState.Closed Then
                    Connections.Open()
    End If

    Commands.Connection = Connections
    Commands.CommandTimeout = 999
    Commands.CommandType = CommandType.Text
    Commands.Parameters.Add("@FileData", SqlDbType.[Image]).Value = FileData
    Commands.CommandText = "Update [Documents] Set Data=@FileData Where ID=1"
    Commands.ExecuteNonQuery()

    If Connections IsNot Nothing Then
                    Connections.Close()
                    Connections.Dispose()
    End If

    以上代码还是出错,检查了程序,我确定 没有问题,请教版主,这会是什么问题呢?

    数据库的表结构如下:

    CREATE TABLE [dbo].[Documents](
     [ID] [int] IDENTITY(1,1) NOT NULL,
     [Data] [image] NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    设置超时时间本来是:
    Commands.CommandTimeout = Commands.Connection.ConnectionTimeout

    后来改成999。

    另外,我感觉是不是SQL语句问题,使用普通插入数据的语句替换UPDATE语句,就没有报错,然后我把 FileData 值得获取由
    Dim FileLength As Integer = UpFile.PostedFile.ContentLength
    Dim FileData(FileLength) As Byte
    FileStream.Read(FileData, 0, FileLength)
    FileStream.Dispose()

    改为

            Dim FileData As Byte()
            FileData = UpFile.FileBytes

    可以正确插入到数据库,但是读取出来的是不正确的,因此,我考虑是不是语句的问题。。。

    我有一个想法,问题应该出在update的SQL语句上,因为image字段的更新合适吗?对于普通varchar类型的更新会很容易,但是IMAGE确定行吗?如果超时怎么处理?现在问题是超时确实是出现了。

    但是,问题是,UPDATE有时候就正常,有时候不正常。。。不正常的情况都是超时,不会有其他错误提示,那么程序可以排除在问题之外,此时,我使用sql 查询分析器来update这个image字段,神奇的是问题重现了。。。应该明天会有答案的。

    今天测试了一下:

    “/”应用程序中的服务器错误。

    超时时间已到。在操作完成之前超时时间已过或服务器未响应。

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.Data.SqlClient.SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。

    源错误:

    行 78: 
    行 79:    Commands.CommandText = DeleteCMD
    行 80:    Commands.ExecuteNonQuery()
    行 81:    Commands.CommandText = UpdateCMD
    行 82:    Commands.ExecuteNonQuery()

     

    有的时候,删除都会出错。。。。一样。。。请教孟老师和大家,有什么好的建议吗?

     

    ete From [Documents] Where ID=12


    做个好汉子,每天要自强------自强不熄
    2010年10月15日 1:42

答案

  • Dim FileLength As Integer = FileUpload1.PostedFile.ContentLength
    Dim FileData(FileLength) As Byte
    Dim fileDataStream As Stream = FileUpload1.PostedFile.InputStream
    FileStream.Read(FileData, 0, FileLength)
    FileStream.Dispose()
    
    Dim ConnectionString AS String = "Server=.;Database=TTT;uid=User;pwd=123456;"
    
    Dim Connections As New SqlConnection(ConnectionString)
    Dim Commands As New SqlCommand()
    
    If Connections.State = ConnectionState.Closed Then
     Connections.Open()
    End If
    
    Commands.Connection = Connections
    Commands.CommandTimeout = 999
    Commands.CommandType = CommandType.Text
    Commands.CommandText = "Update [Documents] Set [Data]=@FileData Where [ID]=1"
    Commands.Parameters.AddWithValue("@FileData", FileData)
    Commands.ExecuteNonQuery()
    
    If Connections IsNot Nothing Then
     Connections.Close()
     Connections.Dispose()
    End If
    

    试试这个

     


    【孟子E章】
    2010年10月15日 6:18
    版主
  • 你好:

    请注意你更新image字段时的操作,如果代码没有问题就是服务器端的性能造成操作超时。你可以尝试换用其它数据库来测试。

    另外,关于数据库的话题请在数据库区提问。谢谢!

    SQL Server
    http://social.microsoft.com/Forums/zh-CN/sqlserverzhchs/threads

    ADO.NET 与 LINQ
    http://social.microsoft.com/Forums/zh-CN/adonetzhchs/threads


    Be stronger!
    2010年10月18日 5:37

全部回复

  • Dim FileLength As Integer = FileUpload1.PostedFile.ContentLength
    Dim FileData(FileLength) As Byte
    Dim fileDataStream As Stream = FileUpload1.PostedFile.InputStream
    FileStream.Read(FileData, 0, FileLength)
    FileStream.Dispose()
    
    Dim ConnectionString AS String = "Server=.;Database=TTT;uid=User;pwd=123456;"
    
    Dim Connections As New SqlConnection(ConnectionString)
    Dim Commands As New SqlCommand()
    
    If Connections.State = ConnectionState.Closed Then
     Connections.Open()
    End If
    
    Commands.Connection = Connections
    Commands.CommandTimeout = 999
    Commands.CommandType = CommandType.Text
    Commands.CommandText = "Update [Documents] Set [Data]=@FileData Where [ID]=1"
    Commands.Parameters.AddWithValue("@FileData", FileData)
    Commands.ExecuteNonQuery()
    
    If Connections IsNot Nothing Then
     Connections.Close()
     Connections.Dispose()
    End If
    

    试试这个

     


    【孟子E章】
    2010年10月15日 6:18
    版主
  • 孟老师,感谢指引,我试了一下,出现错误如下:

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

    异常详细信息: System.Data.SqlClient.SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。

    源错误:

    行 79:       Commands.Parameters.AddWithValue("@FileData", FileData)
    行 80:       'Commands.CommandText = DeleteCMD
    行 81:       Commands.ExecuteNonQuery()
    

    “/”应用程序中的服务器错误。

    超时时间已到。在操作完成之前超时时间已过或服务器未响应。

     


    做个好汉子,每天要自强------自强不熄
    2010年10月15日 7:50
  • /*
       2010年10月15日16:43:44
       用户:
       服务器: (local)
       数据库: TTT
       应用程序:
    */

    “Documents”表
    - 无法创建索引“PK_Documents”。 
    超时时间已到。在操作完成之前超时时间已过或服务器未响应。
    已超过了锁请求超时时段。

    我尝试更改ID为主键,出现错误。。。我再检查一下数据库,稍晚一段时间我给大家消息。。。谢谢



    做个好汉子,每天要自强------自强不熄
    2010年10月15日 8:49
  • 的确很奇怪的问题。。。新建一个数据库,然后新建数据表,使用程序测试以后,数据库操作都会超时。如:上传一个文件到数据库,然后等了一会,删除这个表提示:

    超时时间已到。在操作完成之前超时时间已过或服务器未响应。
    已超过了锁请求超时时段。

    后来我关闭所有(IIS\MSSQLSERVER)服务,再次打开SSMS,删除这个库中的Documents表,就可以了,我还是不太了解为什么DELETE和UPDATE图片类型的 IMAGE 字段会超时。。。而且是数据库服务器端超时。。。我看了部分数据库日志,没看懂,请版主帮忙。


    做个好汉子,每天要自强------自强不熄
    2010年10月18日 2:46
  • 你好:

    请注意你更新image字段时的操作,如果代码没有问题就是服务器端的性能造成操作超时。你可以尝试换用其它数据库来测试。

    另外,关于数据库的话题请在数据库区提问。谢谢!

    SQL Server
    http://social.microsoft.com/Forums/zh-CN/sqlserverzhchs/threads

    ADO.NET 与 LINQ
    http://social.microsoft.com/Forums/zh-CN/adonetzhchs/threads


    Be stronger!
    2010年10月18日 5:37