增加删除图库功能和增加上传图库检查功能
This commit is contained in:
451
CorelDRAW.vb
451
CorelDRAW.vb
@@ -11,15 +11,15 @@ Imports VGCore
|
||||
Public Class CorelDRAW
|
||||
|
||||
Public M_Redisip As String = "127.0.0.1"
|
||||
Public M_Redisport As Integer = 10079 '6379 ' 10079
|
||||
Public M_Redispassword As String = "blw@redis-ser@123" ' "" '
|
||||
Public M_Redisport As Integer = 6379 '10079 ' 10079
|
||||
Public M_Redispassword As String = "" ' "blw@redis-ser@123" ' "" '
|
||||
'redis消息队列
|
||||
Public M_RedisQueue As Queue
|
||||
'事件处理线程
|
||||
Public M_EventThread As Thread
|
||||
|
||||
'素材库路径
|
||||
Private M_MaterialPath As String = "R:\Canvas\material\" '"D:\Canvas\material\" '
|
||||
Private M_MaterialPath As String = "D:\Canvas\material\" ' "R:\Canvas\material\" '
|
||||
'成平文件路径
|
||||
Private M_TplPath As String = "D:\CorelDRAW\"
|
||||
Public G_RedisSub, G_Redislish As RedisSubscriber
|
||||
@@ -157,8 +157,6 @@ Public Class CorelDRAW
|
||||
InpotMessage1("3、打开模板库并创建新文件等待构建图像")
|
||||
|
||||
|
||||
|
||||
|
||||
InpotMessage1("2、酒店标题生成")
|
||||
Dim hotelName As String = ""
|
||||
If node.project IsNot Nothing AndAlso node.project.Count > 0 Then
|
||||
@@ -388,6 +386,286 @@ Public Class CorelDRAW
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' 检测图库文件命名及内容是否符合规范
|
||||
''' </summary>
|
||||
''' <param name="filePath">图库文件路径</param>
|
||||
''' <param name="errorMessage">错误信息输出</param>
|
||||
''' <returns>是否符合规范</returns>
|
||||
Public Function CheckLibraryFile(ByVal filePath As String, ByRef errorMessage As String) As Boolean
|
||||
Dim srcDoc As Document
|
||||
Try
|
||||
' 获取文件名(不含路径和扩展名)
|
||||
Dim fileName As String = Path.GetFileNameWithoutExtension(filePath)
|
||||
|
||||
' 分割文件名
|
||||
Dim fileParts() As String = fileName.Split("_")
|
||||
|
||||
' 检查文件名基本格式
|
||||
If fileParts.Length < 5 Then
|
||||
errorMessage = "文件名格式错误:必须包含公司_系列_库名_版本_备注"
|
||||
Return False
|
||||
End If
|
||||
|
||||
' 检查库名
|
||||
Dim libName As String = fileParts(2)
|
||||
If libName <> "图标图库" AndAlso libName <> "模型图库" Then
|
||||
errorMessage = "库名错误:只能为'图标图库'或'模型图库'"
|
||||
Return False
|
||||
End If
|
||||
|
||||
' 打开文件获取图像名称
|
||||
srcDoc = APP.OpenDocument(filePath, False)
|
||||
Dim imageNames As New List(Of Shape)
|
||||
|
||||
' 遍历所有页、图层和形状获取图像名称
|
||||
For Each nPage As Page In srcDoc.Pages
|
||||
For Each Layer As Layer In nPage.Layers
|
||||
For Each Shape As Shape In Layer.Shapes
|
||||
If Not String.IsNullOrEmpty(Shape.Name) Then
|
||||
imageNames.Add(Shape)
|
||||
End If
|
||||
Next
|
||||
Next
|
||||
Next
|
||||
|
||||
|
||||
|
||||
' 遍历检查每个图像名称
|
||||
For Each imageName As Shape In imageNames
|
||||
If Not CheckImageName(imageName, libName, errorMessage) Then
|
||||
Return False
|
||||
End If
|
||||
Next
|
||||
' 关闭文件
|
||||
srcDoc.Close()
|
||||
errorMessage = ""
|
||||
Return True
|
||||
Catch ex As Exception
|
||||
' 关闭文件
|
||||
If srcDoc IsNot Nothing Then
|
||||
srcDoc.Close()
|
||||
End If
|
||||
|
||||
errorMessage = "文件处理错误:" & ex.Message
|
||||
Return False
|
||||
End Try
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' 检查单个图像名称是否符合规范
|
||||
''' </summary>
|
||||
''' <param name="imageName">图像名称</param>
|
||||
''' <param name="libName">图库类型</param>
|
||||
''' <param name="errorMessage">错误信息输出</param>
|
||||
''' <returns>是否符合规范</returns>
|
||||
Private Function CheckImageName(imageName As Shape, ByVal libName As String, ByRef errorMessage As String) As Boolean
|
||||
' 分割图像名称
|
||||
Dim parts() As String = imageName.Name.Split("_")
|
||||
|
||||
If parts.Length < 2 Then
|
||||
errorMessage = $"图像名称'{imageName.Name}'格式错误:缺少必要部分"
|
||||
Return False
|
||||
End If
|
||||
|
||||
Dim imageType As String = parts(0).ToLower()
|
||||
|
||||
Select Case libName
|
||||
Case "模型图库"
|
||||
Return CheckModelLibraryImage(imageType, parts, imageName, errorMessage)
|
||||
Case "图标图库"
|
||||
Return CheckIconLibraryImage(imageType, parts, imageName.Name, errorMessage)
|
||||
Case Else
|
||||
errorMessage = $"未知图库类型:{libName}"
|
||||
Return False
|
||||
End Select
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' 检查模型图库图像名称
|
||||
''' </summary>
|
||||
Private Function CheckModelLibraryImage(ByVal imageType As String, ByVal parts() As String, imageName As Shape, ByRef errorMessage As String) As Boolean
|
||||
Dim snode As String()
|
||||
Select Case imageType
|
||||
Case "mode"
|
||||
' Mode_连体数_方向_颜色_宽_高
|
||||
If parts.Length < 6 Then
|
||||
errorMessage = $"Mode图像'{imageName.Name}'格式错误:必须为Mode_N连体_方向_颜色_宽_高"
|
||||
Return False
|
||||
End If
|
||||
' 检查连体数格式
|
||||
If Not parts(1).EndsWith("连体") Then
|
||||
errorMessage = $"Mode图像'{imageName.Name}'连体数格式错误:必须包含'连体'"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(parts(4)) OrElse Not IsNumeric(parts(5)) Then
|
||||
errorMessage = $"Mode图像'{imageName.Name}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
|
||||
For Each imageNamenode As Shape In imageName.Shapes
|
||||
snode = imageNamenode.Name.Split("_")
|
||||
Select Case snode(0).ToLower()
|
||||
Case "effect"
|
||||
' Effect_效果名称_w_h
|
||||
If snode.Length < 4 Then
|
||||
errorMessage = $"Effect图像'{imageNamenode.Name}'格式错误:必须为Effect_效果名称_w_h"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(snode(snode.Length - 2)) OrElse Not IsNumeric(snode(snode.Length - 1)) Then
|
||||
errorMessage = $"Effect图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
Return True
|
||||
|
||||
Case "logo"
|
||||
' Logo_图像类型_左右_宽_高
|
||||
If snode.Length < 5 Then
|
||||
errorMessage = $"Logo图像'{imageNamenode.Name}'格式错误:必须为Logo_图像类型_左右(L/R)_宽_高"
|
||||
Return False
|
||||
End If
|
||||
' 检查左右标识
|
||||
If snode(2) <> "L" AndAlso snode(2) <> "R" Then
|
||||
errorMessage = $"Logo图像'{imageNamenode.Name}'左右标识错误:只能为L或R"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(snode(3)) OrElse Not IsNumeric(snode(4)) Then
|
||||
errorMessage = $"Logo图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
Return True
|
||||
|
||||
Case "iconb"
|
||||
' IconB_N连体_方向_颜色_宽_高
|
||||
If snode.Length < 6 Then
|
||||
errorMessage = $"IconB图像'{imageNamenode.Name}'格式错误:必须为IconB_N连体_方向_颜色_宽_高"
|
||||
Return False
|
||||
End If
|
||||
' 检查连体数格式
|
||||
If Not snode(1).EndsWith("连体") Then
|
||||
errorMessage = $"IconB图像'{imageNamenode.Name}'连体数格式错误:必须包含'连体'"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(snode(4)) OrElse Not IsNumeric(snode(5)) Then
|
||||
errorMessage = $"IconB图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
Return True
|
||||
|
||||
Case "trench"
|
||||
' Trench_槽位编号_w_h
|
||||
If snode.Length < 4 Then
|
||||
errorMessage = $"Trench图像'{imageNamenode.Name}'格式错误:必须为Trench_槽位编号_w_h"
|
||||
Return False
|
||||
End If
|
||||
' 检查槽位编号是否为数字
|
||||
If Not IsNumeric(snode(1)) Then
|
||||
errorMessage = $"Trench图像'{imageNamenode.Name}'槽位编号错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(snode(2)) OrElse Not IsNumeric(snode(3)) Then
|
||||
errorMessage = $"Trench图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
|
||||
End Select
|
||||
|
||||
Next
|
||||
Return True
|
||||
|
||||
Case "mono"
|
||||
' Mono_图像名称_w_h
|
||||
If parts.Length < 4 Then
|
||||
errorMessage = $"Mono图像'{imageName.Name}'格式错误:必须为Mono_图像名称_w_h"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(parts(parts.Length - 2)) OrElse Not IsNumeric(parts(parts.Length - 1)) Then
|
||||
errorMessage = $"Mono图像'{imageName.Name}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
|
||||
For Each imageNamenode In imageName.Shapes
|
||||
snode = imageNamenode.Name.Split("_")
|
||||
Select Case snode(0)
|
||||
Case "location"
|
||||
' location_图像类型_按键序号_w_h 或 location_图像类型_按键序号_w_h_行号
|
||||
If snode.Length < 5 OrElse snode.Length > 6 Then
|
||||
errorMessage = $"Location图像'{imageNamenode.Name}'格式错误:必须为location_图像类型_按键序号_w_h[_行号]"
|
||||
Return False
|
||||
End If
|
||||
' 检查按键序号是否为数字
|
||||
If Not IsNumeric(snode(2)) Then
|
||||
errorMessage = $"Location图像'{imageNamenode.Name}'按键序号错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(snode(3)) OrElse Not IsNumeric(snode(4)) Then
|
||||
errorMessage = $"Location图像'{imageNamenode.Name}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
' 如果有行号,检查是否为数字
|
||||
If snode.Length = 6 AndAlso Not IsNumeric(snode(5)) Then
|
||||
errorMessage = $"Location图像'{imageNamenode.Name}'行号错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
|
||||
End Select
|
||||
Next
|
||||
|
||||
Return True
|
||||
|
||||
|
||||
|
||||
Case Else
|
||||
Return True
|
||||
errorMessage = $"模型图库中包含未知图像类型:{imageType}"
|
||||
Return False
|
||||
End Select
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' 检查图标图库图像名称
|
||||
''' </summary>
|
||||
Private Function CheckIconLibraryImage(ByVal imageType As String, ByVal parts() As String, ByVal imageName As String, ByRef errorMessage As String) As Boolean
|
||||
Select Case imageType
|
||||
Case "icon"
|
||||
' Icon_图像名称_图像英文名称_w_h
|
||||
If parts.Length < 5 Then
|
||||
errorMessage = $"Icon图像'{imageName}'格式错误:必须为Icon_图像名称_图像英文名称_w_h"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(parts(parts.Length - 2)) OrElse Not IsNumeric(parts(parts.Length - 1)) Then
|
||||
errorMessage = $"Icon图像'{imageName}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
Return True
|
||||
|
||||
Case "logo"
|
||||
' Logo_图像名称_w_h
|
||||
If parts.Length > 5 OrElse parts.Length < 4 Then
|
||||
errorMessage = $"Logo图像'{imageName}'格式错误:必须为Logo_图像名称_图像英文名称_w_h"
|
||||
Return False
|
||||
End If
|
||||
' 检查宽高是否为数字
|
||||
If Not IsNumeric(parts(parts.Length - 2)) OrElse Not IsNumeric(parts(parts.Length - 1)) Then
|
||||
errorMessage = $"Logo图像'{imageName}'宽高格式错误:必须为数字"
|
||||
Return False
|
||||
End If
|
||||
Return True
|
||||
|
||||
Case Else
|
||||
errorMessage = $"图标图库中包含未知图像类型:{imageType}"
|
||||
Return False
|
||||
End Select
|
||||
End Function
|
||||
|
||||
|
||||
Public Function HandleNodeInformation1(node As RedisInfoNode) As Boolean
|
||||
Dim oldTime As DateTime = Now
|
||||
@@ -2184,6 +2462,48 @@ Public Class CorelDRAW
|
||||
End If
|
||||
End Sub
|
||||
|
||||
' 用于存储文件名和对应id的字典
|
||||
Private M_FileIdDict As New Dictionary(Of String, Integer)
|
||||
|
||||
Private Sub ToolStripComboBox1_DropDown(sender As Object, e As EventArgs) Handles ToolStripComboBox1.DropDown
|
||||
' 清空下拉列表和字典
|
||||
ToolStripComboBox1.Items.Clear()
|
||||
M_FileIdDict.Clear()
|
||||
|
||||
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
|
||||
Dim gLogNode As LogNode
|
||||
|
||||
' 从tbl_cdr_file表查询图库文件名和文件对应id
|
||||
Dim transStr As String = "select id, filename from `cdr_library`.`tbl_cdr_file`;"
|
||||
|
||||
Dim dt As DataTable
|
||||
|
||||
Try
|
||||
npgsqldb.Open()
|
||||
dt = npgsqldb.ExecuteDataTable(transStr)
|
||||
|
||||
' 将查询结果填充到ToolStripComboBox1下拉框中
|
||||
For Each row As DataRow In dt.Rows
|
||||
Dim id As Integer = row("id")
|
||||
Dim filename As String = row("filename")
|
||||
' 将id和filename存储到字典中
|
||||
M_FileIdDict.Add(filename, id)
|
||||
' 下拉框中只显示文件名
|
||||
ToolStripComboBox1.Items.Add(filename)
|
||||
Next
|
||||
|
||||
npgsqldb.Close()
|
||||
Catch ex As Exception
|
||||
If Not IsNothing(npgsqldb) Then
|
||||
npgsqldb.Close()
|
||||
End If
|
||||
|
||||
gLogNode = New LogNode($"查询图库文件失败!{vbCrLf}{ex.Message}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||||
gLogNode.SetLogColor(System.Drawing.Color.Red)
|
||||
G_Log.AddLogNode(gLogNode)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
Private Sub ToolStripButton3_Click(sender As Object, e As EventArgs) Handles ToolStripButton3.Click
|
||||
RichTextBox1.Clear()
|
||||
Dim dic As New Dictionary(Of String, String)
|
||||
@@ -2218,7 +2538,7 @@ Public Class CorelDRAW
|
||||
|
||||
Private Sub ToolStripButton1_Click_1(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
|
||||
'打开文件选择器 选择cDR后缀的文件
|
||||
Dim ServerFilePath As String = "R:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic" ' "D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic" '
|
||||
Dim ServerFilePath As String = "D:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic" ' "R:\IIS ROOT\BLWLog\Web\wwwroot\PanelSelectionPic" '
|
||||
Dim OpenFileDialog1 As New OpenFileDialog()
|
||||
OpenFileDialog1.Filter = "CorelDRAW Files (*.cdr)|*.cdr"
|
||||
Dim srcDoc As Document '素材文件
|
||||
@@ -2232,8 +2552,17 @@ Public Class CorelDRAW
|
||||
Dim gLogNode As LogNode
|
||||
Dim ProjectPath As String
|
||||
Dim SafeFileName As String
|
||||
Dim errorMessage As String
|
||||
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
|
||||
|
||||
' 上传前检查文件是否符合规范
|
||||
If Not CheckLibraryFile(OpenFileDialog1.FileName, errorMessage) Then
|
||||
gLogNode = New LogNode($"图库文件检测失败:{errorMessage}{vbCrLf}", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||||
gLogNode.SetLogColor(System.Drawing.Color.Red)
|
||||
G_Log.AddLogNode(gLogNode)
|
||||
MessageBox.Show(errorMessage, "文件检测失败", MessageBoxButtons.OK, MessageBoxIcon.Error)
|
||||
Return
|
||||
End If
|
||||
|
||||
Dim fid As Integer = AddFileToSQL(OpenFileDialog1.SafeFileName)
|
||||
If fid = -1 Then
|
||||
@@ -2976,4 +3305,114 @@ Public Class CorelDRAW
|
||||
End Try
|
||||
|
||||
End Sub
|
||||
|
||||
|
||||
Private Sub ToolStripButton5_Click(sender As Object, e As EventArgs) Handles ToolStripButton5.Click
|
||||
'删除素材库
|
||||
Try
|
||||
|
||||
|
||||
' 3. 检查是否选择了素材库
|
||||
If String.IsNullOrEmpty(ToolStripComboBox1.Text) Then
|
||||
MsgBox("请先选择要删除的素材库!", vbExclamation, "错误")
|
||||
Return
|
||||
End If
|
||||
|
||||
' 4. 获取选中的素材库名称
|
||||
Dim selectedFileName As String = ToolStripComboBox1.Text
|
||||
' 1. 显示密码输入对话框
|
||||
Dim password As String = InputBox("请输入密码", $"即将删除:{vbCrLf}{selectedFileName}", "", -1, -1)
|
||||
|
||||
' 2. 验证密码
|
||||
If password <> "123456" Then
|
||||
MsgBox("密码错误,删除失败!", vbExclamation, "错误")
|
||||
Return
|
||||
End If
|
||||
' 5. 从字典中获取对应的ID
|
||||
If M_FileIdDict.ContainsKey(selectedFileName) Then
|
||||
Dim fileId As Integer = M_FileIdDict(selectedFileName)
|
||||
|
||||
' 6. 执行数据库删除操作
|
||||
Dim npgsqldb As DbExecutor = New DbExecutor(DbExecutor.DbTypeEnum.Mysql, LocalConnString)
|
||||
Try
|
||||
npgsqldb.Open()
|
||||
|
||||
' 7. 开始事务
|
||||
npgsqldb.BeginTransaction()
|
||||
|
||||
' 8. 根据素材库类型执行不同的删除逻辑
|
||||
If selectedFileName.Contains("图标图库") Then
|
||||
' 删除图标素材库相关数据
|
||||
' 删除tbl_iconlibrary中FID一致的数据
|
||||
Dim deleteIconSql As String = $"DELETE FROM `cdr_library`.`tbl_iconlibrary` WHERE `FID` = {fileId};"
|
||||
npgsqldb.ExecuteNonQuery(deleteIconSql)
|
||||
ElseIf selectedFileName.Contains("模型图库") Then
|
||||
' 删除模型素材库相关数据
|
||||
|
||||
' 1. 处理tbl_model相关数据
|
||||
' 查询tbl_model中FID等于fileId的数据
|
||||
Dim modelSql As String = $"SELECT `Id` FROM `cdr_library`.`tbl_model` WHERE `FID` = {fileId};"
|
||||
Dim modelDt As DataTable = npgsqldb.ExecuteDataTable(modelSql)
|
||||
|
||||
' 遍历tbl_model表得到的ID
|
||||
For Each modelRow As DataRow In modelDt.Rows
|
||||
Dim modelId As Integer = modelRow("Id")
|
||||
|
||||
' 删除tbl_trench中MID符合的数据
|
||||
Dim deleteTrenchSql As String = $"DELETE FROM `cdr_library`.`tbl_trench` WHERE `MID` = {modelId};"
|
||||
npgsqldb.ExecuteNonQuery(deleteTrenchSql)
|
||||
|
||||
' 删除tbl_model中对应ID的数据
|
||||
Dim deleteModelSql As String = $"DELETE FROM `cdr_library`.`tbl_model` WHERE `ID` = {modelId};"
|
||||
npgsqldb.ExecuteNonQuery(deleteModelSql)
|
||||
Next
|
||||
|
||||
' 2. 处理tbl_pattern相关数据
|
||||
' 查询tbl_pattern中FID等于fileId的数据
|
||||
Dim patternSql As String = $"SELECT `Id` FROM `cdr_library`.`tbl_pattern` WHERE `FID` = {fileId};"
|
||||
Dim patternDt As DataTable = npgsqldb.ExecuteDataTable(patternSql)
|
||||
|
||||
' 遍历tbl_pattern表得到的ID
|
||||
For Each patternRow As DataRow In patternDt.Rows
|
||||
Dim patternId As Integer = patternRow("Id")
|
||||
|
||||
' 删除tbl_location中MID符合的数据
|
||||
Dim deleteLocationSql As String = $"DELETE FROM `cdr_library`.`tbl_location` WHERE `PID` = {patternId};"
|
||||
npgsqldb.ExecuteNonQuery(deleteLocationSql)
|
||||
|
||||
' 删除tbl_pattern中对应ID的数据
|
||||
Dim deletePatternSql As String = $"DELETE FROM `cdr_library`.`tbl_pattern` WHERE `ID` = {patternId};"
|
||||
npgsqldb.ExecuteNonQuery(deletePatternSql)
|
||||
Next
|
||||
End If
|
||||
|
||||
' 9. 删除tbl_cdr_file中对应id的数据
|
||||
Dim deleteFileSql As String = $"DELETE FROM `cdr_library`.`tbl_cdr_file` WHERE `ID` = {fileId};"
|
||||
npgsqldb.ExecuteNonQuery(deleteFileSql)
|
||||
|
||||
' 10. 提交事务
|
||||
npgsqldb.CommitTransaction()
|
||||
|
||||
' 11. 从下拉框中移除已删除的选项
|
||||
ToolStripComboBox1.Items.Remove(selectedFileName)
|
||||
|
||||
' 12. 清空选择
|
||||
ToolStripComboBox1.Text = ""
|
||||
|
||||
' 13. 显示成功消息
|
||||
MsgBox("素材库删除成功!", vbInformation, "成功")
|
||||
Catch ex As Exception
|
||||
' 14. 回滚事务
|
||||
npgsqldb.RollbackTransaction()
|
||||
MsgBox($"删除失败:{ex.Message}", vbExclamation, "错误")
|
||||
Finally
|
||||
npgsqldb.Close()
|
||||
End Try
|
||||
Else
|
||||
MsgBox("未找到素材库对应的ID!", vbExclamation, "错误")
|
||||
End If
|
||||
Catch ex As Exception
|
||||
MsgBox($"操作失败:{ex.Message}", vbExclamation, "错误")
|
||||
End Try
|
||||
End Sub
|
||||
End Class
|
||||
|
||||
Reference in New Issue
Block a user