You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将签证号文件与机票的新链接保存至数据库求助

无法将签证号文件与机票文件路径保存至数据库

执行代码无报错,但数据库中selectedVisanumberFile和selectedTicket字段始终为空,无法保存文件新路径。以下是相关代码:

UpdateData 方法

Public Sub UpdateData(recordID As Integer, name As String, contact As String, email As String, passport As String, nationality As String, position As String, company As String, basic As String, food As String, housing As String, transportation As String, offer As String, medical As String, remarks As String, visaPosition As String, visaNumber As String, visaNumberFile As String, airline As String, arrival As String, ticketFile As String, assignLocation As String, status As String, agency As String)
    Using connection As OleDbConnection = DatabaseManager.GetConnection()
        connection.Open()
        Using transaction As OleDbTransaction = connection.BeginTransaction()
            Try
                Dim commandString As String = "UPDATE recruitmentStatus SET [selectedName]=?, [selectedContact]=?, [selectedEmail]=?, [selectedPassport]=?, [selectedNationality]=?, [selectedPosition]=?, [selectedCompany]=?, [selectedBasic]=?, [selectedFood]=?, [SelectedHousing]=?, [selectedTransportation]=?, [SelectedOffer]=?, [selectedMedical]=?, [selectedRemarks]=?, [selectedVisaposition]=?, [selectedVisanumber]=?, [selectedVisanumberFile]=?, [selectedAirline]=?, [selectedArrival]=?, [selectedTicket]=?, [selectedAssignlocation]=?,[selectedStatus]=?, [selectedAgency]=?  WHERE [ID]=?"

                Using command As New OleDbCommand(commandString, connection, transaction)

                    command.Parameters.AddWithValue("selectedName", name)
                    command.Parameters.AddWithValue("selectedContact", contact)
                    command.Parameters.AddWithValue("selectedEmail", email)
                    command.Parameters.AddWithValue("selectedPassport", passport)
                    command.Parameters.AddWithValue("selectedNationality", nationality)
                    command.Parameters.AddWithValue("selectedPosition", position)
                    command.Parameters.AddWithValue("selectedCompany", company)
                    command.Parameters.AddWithValue("selectedBasic", basic)
                    command.Parameters.AddWithValue("selectedFood", food)
                    command.Parameters.AddWithValue("SelectedHousing", housing)
                    command.Parameters.AddWithValue("selectedTransportation", transportation)
                    command.Parameters.AddWithValue("SelectedOffer", offer)
                    command.Parameters.AddWithValue("selectedMedical", medical)
                    command.Parameters.AddWithValue("selectedRemarks", remarks)
                    command.Parameters.AddWithValue("selectedVisaposition", visaPosition)
                    command.Parameters.AddWithValue("selectedVisanumber", visaNumber)

                    ' 获取新文件路径
                    Dim newVisaNumberFile As String = SaveFileAndGetPath(name, visaNumberFile, "Visa")
                    Dim newTicketFile As String = SaveFileAndGetPath(name, ticketFile, "Ticket")

                    ' 更新文件路径参数
                    command.Parameters.AddWithValue("selectedVisanumberFile", newVisaNumberFile)
                    command.Parameters.AddWithValue("selectedAirline", airline)
                    command.Parameters.AddWithValue("selectedArrival", arrival)
                    command.Parameters.AddWithValue("selectedTicket", newTicketFile)

                    command.Parameters.AddWithValue("selectedAssignlocation", assignLocation)
                    command.Parameters.AddWithValue("selectedStatus", status)
                    command.Parameters.AddWithValue("selectedAgency", agency)
                    command.Parameters.AddWithValue("ID", recordID)

                    Dim result As Integer = command.ExecuteNonQuery()

                    If result > 0 Then
                        transaction.Commit()
                        MessageBox.Show("Data has been successfully updated.")
                        clearData()
                    Else
                        MessageBox.Show("No records were updated. Please check the ID and data.")
                    End If
                End Using
            Catch ex As OleDbException
                transaction.Rollback()
                MessageBox.Show("Database Error: " & ex.Message, "Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Catch ex As Exception
                transaction.Rollback()
                MessageBox.Show("Error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Using
    End Using
End Sub

SaveFileAndGetPath 方法

Private Function SaveFileAndGetPath(candidateName As String, filePath As String, fileType As String) As String
    Try
        Dim baseFolder As String = "F:\HR Main Folder\Recruitment\Recruitment Selected Candidate files"
        Dim candidateFolder As String = Path.Combine(baseFolder, candidateName)

        If Not Directory.Exists(candidateFolder) Then
            Directory.CreateDirectory(candidateFolder)
        End If

        Dim subFolder As String = ""
        Select Case fileType
            Case "Visa"
                subFolder = "Visa"
            Case "Ticket"
                subFolder = "Ticket"
        End Select

        Dim subFolderPath As String = Path.Combine(candidateFolder, subFolder)

        If Not Directory.Exists(subFolderPath) Then
            Directory.CreateDirectory(subFolderPath)
        End If

        Dim fileName As String = $"{fileType}-{DateTime.Now.ToString("MMMM dd, yyyy")}{Path.GetExtension(filePath)}"
        Dim destinationPath As String = Path.Combine(subFolderPath, fileName)

        File.Copy(filePath, destinationPath)
        File.Delete(filePath)
        Return destinationPath
    Catch ex As Exception
        Return String.Empty
    End Try
End Function

排查与修复建议

1. 修复SaveFileAndGetPath的异常吞噬问题

当前方法捕获异常后直接返回空字符串,导致文件保存失败时无任何提示,数据库字段被设为空。修改方法如下:

Private Function SaveFileAndGetPath(candidateName As String, filePath As String, fileType As String) As String
    ' 先校验输入路径
    If String.IsNullOrWhiteSpace(filePath) Then
        Throw New ArgumentException($"请选择有效的{fileType}文件", "filePath")
    End If

    Try
        ' 原有文件处理逻辑
        Dim baseFolder As String = "F:\HR Main Folder\Recruitment\Recruitment Selected Candidate files"
        Dim candidateFolder As String = Path.Combine(baseFolder, candidateName)

        If Not Directory.Exists(candidateFolder) Then
            Directory.CreateDirectory(candidateFolder)
        End If

        Dim subFolder As String = fileType ' 简化分支逻辑
        Dim subFolderPath As String = Path.Combine(candidateFolder, subFolder)

        If Not Directory.Exists(subFolderPath) Then
            Directory.CreateDirectory(subFolderPath)
        End If

        Dim fileName As String = $"{fileType}-{DateTime.Now.ToString("MMMM dd, yyyy")}{Path.GetExtension(filePath)}"
        Dim destinationPath As String = Path.Combine(subFolderPath, fileName)

        File.Copy(filePath, destinationPath, True) ' 添加覆盖选项,避免文件重名报错
        ' 可选:不要删除原文件,避免用户误操作丢失文件
        ' File.Delete(filePath)
        Return destinationPath
    Catch ex As Exception
        MessageBox.Show($"保存{fileType}文件失败: {ex.Message}", "文件操作错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Throw ' 重新抛出异常,触发事务回滚
    End Try
End Function

2. 严格匹配OleDb参数顺序

OleDb不支持命名参数匹配,参数必须与SQL语句中的?占位符顺序完全一致。当前代码在添加到selectedVisanumber参数后,插入了文件路径获取逻辑,建议调整为先获取所有文件路径,再按SQL顺序添加所有参数,避免潜在的顺序混乱:

' 先获取文件路径,放在参数添加之前
Dim newVisaNumberFile As String = SaveFileAndGetPath(name, visaNumberFile, "Visa")
Dim newTicketFile As String = SaveFileAndGetPath(name, ticketFile, "Ticket")

Using command As New OleDbCommand(commandString, connection, transaction)
    ' 严格按照SQL语句的字段顺序添加参数
    command.Parameters.AddWithValue("selectedName", name)
    command.Parameters.AddWithValue("selectedContact", contact)
    command.Parameters.AddWithValue("selectedEmail", email)
    command.Parameters.AddWithValue("selectedPassport", passport)
    command.Parameters.AddWithValue("selectedNationality", nationality)
    command.Parameters.AddWithValue("selectedPosition", position)
    command.Parameters.AddWithValue("selectedCompany", company)
    command.Parameters.AddWithValue("selectedBasic", basic)
    command.Parameters.AddWithValue("selectedFood", food)
    command.Parameters.AddWithValue("SelectedHousing", housing)
    command.Parameters.AddWithValue("selectedTransportation", transportation)
    command.Parameters.AddWithValue("SelectedOffer", offer)
    command.Parameters.AddWithValue("selectedMedical", medical)
    command.Parameters.AddWithValue("selectedRemarks", remarks)
    command.Parameters.AddWithValue("selectedVisaposition", visaPosition)
    command.Parameters.AddWithValue("selectedVisanumber", visaNumber)
    ' 对应SQL中的selectedVisanumberFile
    command.Parameters.AddWithValue("selectedVisanumberFile", newVisaNumberFile)
    command.Parameters.AddWithValue("selectedAirline", airline)
    command.Parameters.AddWithValue("selectedArrival", arrival)
    ' 对应SQL中的selectedTicket
    command.Parameters.AddWithValue("selectedTicket", newTicketFile)
    command.Parameters.AddWithValue("selectedAssignlocation", assignLocation)
    command.Parameters.AddWithValue("selectedStatus", status)
    command.Parameters.AddWithValue("selectedAgency", agency)
    ' 最后是WHERE条件的ID
    command.Parameters.AddWithValue("ID", recordID)

    Dim result As Integer = command.ExecuteNonQuery()
    ' ... 后续逻辑
End Using

3. 检查数据库字段类型长度

如果使用Access数据库,Text字段默认仅支持255字符,长文件路径会被截断为空。需将selectedVisanumberFile和selectedTicket字段类型修改为Long Text(原Memo类型);如果是SQL Server,修改为VARCHAR(MAX)或NVARCHAR(MAX)。

4. 校验输入参数有效性

在调用UpdateData前,确保传入的visaNumberFile和ticketFile不为空或无效路径,比如在UI层添加选择文件后的校验:

' 示例:UI层调用前的校验
If String.IsNullOrWhiteSpace(txtVisaFile.Text) Then
    MessageBox.Show("请选择签证号文件", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    Return
End If
If String.IsNullOrWhiteSpace(txtTicketFile.Text) Then
    MessageBox.Show("请选择机票文件", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    Return
End If

' 调用UpdateData
UpdateData(recordID, name, ..., txtVisaFile.Text, ..., txtTicketFile.Text, ...)

内容的提问来源于stack exchange,提问作者Unknown Source

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:29:49