一个数据访问层的类库,数据操使用了一个公共类DataAccessor,Department是访问Department的数据访问类,新建没有问题,但是更新却不成功,没有抛出异常,影响的行数是0。因为新建和更新都是使用DataAccessor中的ExecuteNonQuery方法,那么新建成功说明这个方法没有问题,在Access中执行SQL语句SQL_UPDATE_DEPARTMENT(是个常数)也成功,没有问题。那么问题到底在哪里呢?请高手指点,谢谢。
数据访问公用类(为了方便,只提供相关内容):
Imports System.Data.OleDb
Imports System.Windows.FormsFriend Class DataAccessor
    Private Shared m_ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\" & System.Configuration.ConfigurationSettings.AppSettings("DatabaseLocation")
   
    Public Shared ReadOnly Property ConnectionString() As String
        Get
            Return m_ConnectionString
        End Get
    End PropertyPublic Shared Function ExecuteNonQuery(ByVal commandText As String, ByVal parameters As OleDbParameter()) As Boolean
        Dim myRowsAffected As Integer        Dim myConnection As New OleDbConnection(ConnectionString)
        Dim myCommand As OleDbCommand = PrepareCommand(commandText, myConnection, parameters)
        myCommand.Connection.Open()
        MessageBox.Show(myConnection.ServerVersion)
        myRowsAffected = myCommand.ExecuteNonQuery
        myCommand.Connection.Close()
        If myRowsAffected > 0 Then
            Return True
        Else
            Return False
        End If
    End Function Private Shared Function PrepareCommand(ByVal commandText As String, ByVal connection As OleDbConnection, ByVal parameters As OleDbParameter())        Dim myCommand As New OleDbCommand(commandText, connection)        myCommand.CommandType = CommandType.Text        If Not (parameters Is Nothing) Then
            For Each myParameter As OleDbParameter In parameters
                myCommand.Parameters.Add(myParameter)
            Next
        End If        Return myCommand
    End Function
End Class数据访问类(为了方便,只提供相关内容):
Public Class Department
    Const SQL_UPDATE_DEPARTMENT As String = "UPDATE Cas_Department SET Name=@Name,EstablishDate=@EstablishDate,Nature=@Nature,Director=@Director,Address=@Address,Tel=@Tel,Contact=@Contact WHERE DepartmentId=@DepartmentId" Public Function Update(ByVal departmentId As Integer, ByVal name As String, ByVal establishDate As DateTime, ByVal nature As String, ByVal director As String, ByVal address As String, ByVal tel As String, ByVal contact As String) As Boolean
        Dim myParameters As OleDbParameter()
        myParameters = New OleDbParameter() {New OleDbParameter("@DepartmentId", OleDbType.Integer), New OleDbParameter("@Name", OleDbType.VarChar), New OleDbParameter("@EstablishDate", OleDbType.Date), New OleDbParameter("@Nature", OleDbType.VarChar), New OleDbParameter("@Director", OleDbType.VarChar), New OleDbParameter("@Address", OleDbType.VarChar), New OleDbParameter("@Tel", OleDbType.VarChar), New OleDbParameter("@Contact", OleDbType.VarChar)}
        myParameters(0).Value = departmentId
        myParameters(1).Value = name
        myParameters(2).Value = establishDate
        myParameters(3).Value = nature
        myParameters(4).Value = director
        myParameters(5).Value = address
        myParameters(6).Value = tel
        myParameters(7).Value = contact
        If DataAccessor.ExecuteNonQuery(SQL_UPDATE_DEPARTMENT, myParameters) Then
            m_departmentId = departmentId
            m_name = name
            m_establishDate = establishDate
            m_nature = nature
            m_director = director
            m_address = address
            m_tel = tel
            m_contact = contact
            Return True
        Else
            Return False
        End If
    End FunctionEnd Class

解决方案 »

  1.   

    你的表里的字段名有没有跟系统关键字相同而冲突呢?我昨天就是因为用了desribe做字段名,程序执行插入失败,但把sql语句放到access数据库里执行却没问题,搞了半天才查出原因,幸好有高手帮忙的.
      

  2.   

    能Insert 就表示不会有系统保留字!CommandType默认为Text,所有你这里可以不指定,那么使用参数传递的意义也就不大。建议你直接传递一个SQL文本参数到cmd.CommandText,或提供一个属性。这样出错的机率要小得多!
      

  3.   

    字段名没有冲突的,这是插入的SQL:Const SQL_INSERT_DEPARTMENT As String = "INSERT INTO Cas_Department(Name,EstablishDate,Nature,Director,Address,Tel,Contact) VALUES (@Name,@EstablishDate,@Nature,@Director,@Address,@Tel,@Contact)" 没有问题,成功执行。Update SQL和它相比,多用了一个字段名DepartmentId,这个字段肯定不是关键字的吧。所以字段名应该没有问题。
      

  4.   

    传入的DepartmentId在数据库中也是存在的。在DataAccessor类中中断看,也没有问题。
      

  5.   

    DepartmentId 是自动增号类型的你确定 再更新时 主键的值已经传入并找到这条记录?
      

  6.   

    在更新的时候,DepartmentId确实已经传入了,中断时看OleDbCommand的Parameters,有看到DepartmentId的值是7,数据库中确实存在这条记录。
      

  7.   

    提供全部源代码,请各位高手看看。调了两天了,还是不知道是怎么回事。今天不用Parameter试可以,但是看OleDbCommand.Parameters完全正确的,况且增加和删除都没有问题,实在费解。拜托各位高手了。代码地址:http://www.phsc.com.cn/code/cas.rar
      

  8.   

    Access有可能是有问题的,我原来用过,后来记得解决办法是先删后插入
      

  9.   

    Const SQL_UPDATE_DEPARTMENT As String = "UPDATE Cas_Department SET Name=?,EstablishDate=?,Nature=?... WHERE DepartmentId=?"
    用?代替参数 
      

  10.   

    偶知道结果了,参数要按SQL中定义得顺序来,它不认参数名只认顺序,比如SQL:"UPDATE Cas_Department SET Name=@Name,EstablishDate=@EstablishDate,Nature=@Nature,Director=@Director,Address=@Address,Tel=@Tel,Contact=@Contact WHERE DepartmentId=@DepartmentId",定义得参数顺序要这样: Dim myParameters As OleDbParameter()
            myParameters = New OleDbParameter() {New OleDbParameter("@ProfessionalId", OleDbType.Integer), New OleDbParameter("@Name", OleDbType.VarChar), New OleDbParameter("@Number", OleDbType.VarChar), New OleDbParameter("@GetDate", OleDbType.Date), New OleDbParameter("@GetMethod", OleDbType.VarChar), New OleDbParameter("@PaperId", OleDbType.Integer)}        myParameters(0).Value = professionalId
            myParameters(1).Value = name
            myParameters(2).Value = number
            myParameters(3).Value = getDate
            myParameters(4).Value = getMethod
            myParameters(5).Value = paperId
    不能颠倒,以前用SQLServer的,没有这个问题,Access真是差啊。谢谢各位了。
      

  11.   

    上边一个有点错,激动了,应该是这样:偶知道结果了,参数要按SQL中定义得顺序来,它不认参数名只认顺序,比如SQL:"UPDATE Cas_Paper SET ProfessionalId=@ProfessionalId,Name=@Name,[Number]=@Number,GetDate=@GetDate,GetMethod=@GetMethod WHERE PaperId=@PaperId"定义得参数顺序要这样:Dim myParameters As OleDbParameter()
    myParameters = New OleDbParameter() {New OleDbParameter("@ProfessionalId", OleDbType.Integer), New OleDbParameter("@Name", OleDbType.VarChar), New OleDbParameter("@Number", OleDbType.VarChar), New OleDbParameter("@GetDate", OleDbType.Date), New OleDbParameter("@GetMethod", OleDbType.VarChar)}
            myParameters(0).Value = professionalId
            myParameters(1).Value = name
            myParameters(2).Value = number
            myParameters(3).Value = getDate
            myParameters(4).Value = getMethod不能颠倒,以前用SQLServer的,没有这个问题,Access真是差啊。谢谢各位了。