From f0f0f74e2fee4e0575ebed33c57b88e3cd596086 Mon Sep 17 00:00:00 2001 From: chenzhihao <1798906853@qq.com> Date: Tue, 10 Mar 2026 16:34:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=BA=E4=BB=B6=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=8D=A2=E7=AE=97=E6=96=B9=E5=BC=8F=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=B8=8A=E4=BC=A0=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/BLV_Studio/v16/.suo | Bin 713216 -> 727040 bytes BLV_Studio/Database/DbExecutor.vb | 77 +++++ BLV_Studio/FrmMain.Designer.vb | 21 +- BLV_Studio/FrmMain.vb | 325 +++++++++++++++++- BLV_Studio/Test/GridTest/ReportingScenario.vb | 4 + BLV_Studio/Test/GridTest/TableInteraction.vb | 4 + BLV_Studio/bin/Debug/BLV_Studio.xml | 27 ++ BLV_Studio/obj/Debug/BLV_Studio.xml | 27 ++ 8 files changed, 479 insertions(+), 6 deletions(-) diff --git a/.vs/BLV_Studio/v16/.suo b/.vs/BLV_Studio/v16/.suo index 882f666fca8724b0afc491ecd8757bb280cc6105..d00065073deb41a0edfc7ead56caa34a0037284e 100644 GIT binary patch delta 9468 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 L4m-JZ(y9GBaG%kn delta 7727 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 Cdo|qv diff --git a/BLV_Studio/Database/DbExecutor.vb b/BLV_Studio/Database/DbExecutor.vb index 6e8877a..2bee45c 100644 --- a/BLV_Studio/Database/DbExecutor.vb +++ b/BLV_Studio/Database/DbExecutor.vb @@ -374,4 +374,81 @@ Public Class DbExecutor GC.Collect() '对所有缓存垃圾进行回收 End Sub + + + ''' + ''' 添加参数到命令(简化版本,自动推断参数类型) + ''' + ''' 参数名称(需包含@或:前缀) + ''' 参数值 + ''' 创建的DbParameter对象 + Public Function AddParameter(parameterName As String, value As Object) As DbParameter + ' 自动根据值类型推断DbType + Dim dbType As DbType + Dim convertedValue As Object = value + + If value Is Nothing OrElse DBNull.Value.Equals(value) Then + dbType = DbType.Object + convertedValue = DBNull.Value + Else + Select Case value.GetType() + Case GetType(Integer) + dbType = DbType.Int32 + Case GetType(String) + dbType = DbType.String + Case GetType(Boolean) + dbType = DbType.Boolean + Case GetType(DateTime) + dbType = DbType.DateTime + Case GetType(Decimal) + dbType = DbType.Decimal + Case GetType(Double) + dbType = DbType.Double + Case GetType(Single) + dbType = DbType.Single + Case GetType(Byte()) + dbType = DbType.Binary + Case GetType(Guid) + dbType = DbType.Guid + Case Else + dbType = DbType.Object + End Select + End If + + ' 调用现有的AddDbParameter方法 + Return AddDbParameter(dbType, parameterName, convertedValue) + End Function + + ''' + ''' 添加参数到命令(指定明确的类型) + ''' + ''' 参数名称 + ''' 参数值 + ''' 参数的数据类型 + ''' 创建的DbParameter对象 + Public Function AddParameter(parameterName As String, value As Object, dbType As DbType) As DbParameter + Dim convertedValue As Object = value + + ' 处理空值 + If value Is Nothing OrElse DBNull.Value.Equals(value) Then + convertedValue = DBNull.Value + End If + + Return AddDbParameter(dbType, parameterName, convertedValue) + End Function + + ''' + ''' 添加参数到命令(包含方向) + ''' + ''' 参数名称 + ''' 参数值 + ''' 参数的数据类型 + ''' 参数方向(输入/输出) + ''' 创建的DbParameter对象 + Public Function AddParameter(parameterName As String, value As Object, dbType As DbType, direction As ParameterDirection) As DbParameter + Dim param = AddParameter(parameterName, value, dbType) + param.Direction = direction + Return param + End Function + End Class \ No newline at end of file diff --git a/BLV_Studio/FrmMain.Designer.vb b/BLV_Studio/FrmMain.Designer.vb index 7574d77..e0a7d90 100644 --- a/BLV_Studio/FrmMain.Designer.vb +++ b/BLV_Studio/FrmMain.Designer.vb @@ -265,6 +265,7 @@ Partial Class FrmMain Me.tsb_SyncConfigFiles = New System.Windows.Forms.ToolStripButton() Me.ToolStripButton4 = New System.Windows.Forms.ToolStripButton() Me.ToolStripButton17 = New System.Windows.Forms.ToolStripButton() + Me.ToolStripButton23 = New System.Windows.Forms.ToolStripButton() Me.MsMain.SuspendLayout() Me.StatusStrip1.SuspendLayout() Me.CmsEvent.SuspendLayout() @@ -1140,17 +1141,15 @@ Partial Class FrmMain ' 'ToolStripButton19 ' - Me.ToolStripButton19.Enabled = False Me.ToolStripButton19.Font = New System.Drawing.Font("宋体", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte)) Me.ToolStripButton19.ForeColor = System.Drawing.Color.Black Me.ToolStripButton19.Image = CType(resources.GetObject("ToolStripButton19.Image"), System.Drawing.Image) Me.ToolStripButton19.ImageTransparentColor = System.Drawing.Color.Magenta Me.ToolStripButton19.Name = "ToolStripButton19" - Me.ToolStripButton19.Size = New System.Drawing.Size(33, 37) - Me.ToolStripButton19.Text = "导出" + Me.ToolStripButton19.Size = New System.Drawing.Size(81, 37) + Me.ToolStripButton19.Text = "上传设备信息" Me.ToolStripButton19.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText Me.ToolStripButton19.ToolTipText = "将文件导出到Excel表格" - Me.ToolStripButton19.Visible = False ' 'ToolStripSeparator22 ' @@ -1580,7 +1579,7 @@ Partial Class FrmMain ' 'ToolStrip2 ' - Me.ToolStrip2.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.tsb_ReleaseToProjcet, Me.ToolStripSeparator7, Me.tsb_RuleCheck, Me.tsb_Compile, Me.tsb_DownLoad, Me.ToolStripSeparator4, Me.TsBtnNewFile, Me.TsBtnLoad, Me.tsb_SaveFile, Me.TsBtnSaveAs, Me.tsb_OpenFileFolder, Me.ToolStripSeparator6, Me.TsBtnAddModel, Me.TsBtnAddActions, Me.TsBtnAddDev, Me.TsBtnAddCondition, Me.TsBtnAddAction, Me.tsb_ExportToExcel, Me.ToolStripSeparator13, Me.UploadFirmware_btn, Me.ToolStripSeparator17}) + Me.ToolStrip2.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.tsb_ReleaseToProjcet, Me.ToolStripSeparator7, Me.tsb_RuleCheck, Me.tsb_Compile, Me.tsb_DownLoad, Me.ToolStripSeparator4, Me.TsBtnNewFile, Me.TsBtnLoad, Me.tsb_SaveFile, Me.TsBtnSaveAs, Me.tsb_OpenFileFolder, Me.ToolStripSeparator6, Me.TsBtnAddModel, Me.TsBtnAddActions, Me.TsBtnAddDev, Me.TsBtnAddCondition, Me.TsBtnAddAction, Me.tsb_ExportToExcel, Me.ToolStripSeparator13, Me.UploadFirmware_btn, Me.ToolStripSeparator17, Me.ToolStripButton23}) Me.ToolStrip2.Location = New System.Drawing.Point(3, 3) Me.ToolStrip2.Name = "ToolStrip2" Me.ToolStrip2.Size = New System.Drawing.Size(987, 40) @@ -2706,6 +2705,17 @@ Partial Class FrmMain Me.ToolStripButton17.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText Me.ToolStripButton17.Visible = False ' + 'ToolStripButton23 + ' + Me.ToolStripButton23.ForeColor = System.Drawing.Color.Blue + Me.ToolStripButton23.Image = CType(resources.GetObject("ToolStripButton23.Image"), System.Drawing.Image) + Me.ToolStripButton23.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripButton23.Name = "ToolStripButton23" + Me.ToolStripButton23.Size = New System.Drawing.Size(60, 37) + Me.ToolStripButton23.Text = "上传设备" + Me.ToolStripButton23.TextAlign = System.Drawing.ContentAlignment.MiddleRight + Me.ToolStripButton23.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText + ' 'FrmMain ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!) @@ -3031,4 +3041,5 @@ Partial Class FrmMain Friend WithEvents lab_RoomType As Label Friend WithEvents ToolStripButton17 As ToolStripButton Friend WithEvents TvwMain As TreeViewEx + Friend WithEvents ToolStripButton23 As ToolStripButton End Class diff --git a/BLV_Studio/FrmMain.vb b/BLV_Studio/FrmMain.vb index 886bbd1..18e8fdc 100644 --- a/BLV_Studio/FrmMain.vb +++ b/BLV_Studio/FrmMain.vb @@ -4569,7 +4569,7 @@ Public Class FrmMain If Not String.IsNullOrEmpty(FirmwareVer) Then Dim Firbuf As String() = FirmwareVer.Split("_") If Firbuf.Length > 3 Then - FVer = Convert.ToInt32(Firbuf(3)) + FVer = Convert.ToInt32(Firbuf(3), 16) End If End If If _TableInteraction.TableCompiletoByte(FVer, savePath, True) = True Then @@ -4841,6 +4841,317 @@ Public Class FrmMain + Private Sub ToolStripButton19_Click(sender As Object, e As EventArgs) Handles ToolStripButton19.Click + If Releaseflag And Not IsNothing(TvwMain.SelectedNode) Then + Else + MsgBox("Please select the publishing node.") + Return + End If + Dim TrNode As TreeNode = TvwMain.SelectedNode + + If TrNode.Level > 1 Then + TrNode = TrNode.Parent + End If + Dim FirmwareVer As String = TrNode.FirstNode.NextNode.NextNode.Text ' TrNode.NextVisibleNode.NextNode.Text + Dim FVer As Integer = 0 + If Not String.IsNullOrEmpty(FirmwareVer) Then + Dim Firbuf As String() = FirmwareVer.Split("_") + If Firbuf.Length > 3 Then + '将Firbuf(3)十六进制字符串转换为十进制 + + + FVer = Convert.ToInt32(Firbuf(3), 16) + End If + End If + UploadDeviceList(FVer) + End Sub + + Public Sub UploadDeviceList(pzVer As Integer) + ' 1. 参数验证 + If Not Releaseflag OrElse IsNothing(TvwMain.SelectedNode) Then + MsgBox("Please select the publishing node.") + Return + End If + + If IsNothing(_TableInteraction) Then + MsgBox("Unselected model") + Return + End If + + Try + ' 2. 获取数据 + Dim aaa = _TableInteraction.TestReportingScenario1() + If IsNothing(aaa) Then + MsgBox("Please configure the logical table first.") + Return + End If + + ' 3. 序列化 JSON + Dim device_list_json As String = JsonConvert.SerializeObject(aaa.TDevicemodel) + + + + Dim hotel_id As Integer = _project.HotelIndex + Dim roomtype_id As Integer = _project.RoomType(g_CurrentTreeNodeRoomTypeItemIndex).structRoomType_ID + Dim createTime As String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + + ' 5. 使用参数化查询 + Dim insertStr As String = "INSERT INTO `blv_rcu_db`.`tbl_room_type_device` " & + "(`hotel_id`, `roomtype_id`, `device_list_json`, `version`, `create_time`) " & + "VALUES (@hotel_id, @roomtype_id, @device_list_json, @version, @create_time)" + + Using db As New DbExecutor(DbExecutor.DbTypeEnum.Mysql, DbConnString) + db.Open() + + ' 清空可能存在的旧参数 + db.ClearDbParameter() + + '' 使用新的AddParameter方法添加参数 + 'db.AddParameter("@hotel_id", hotel_id) + 'db.AddParameter("@roomtype_id", roomtype_id) + 'db.AddParameter("@device_list_json", device_list_json) + 'db.AddParameter("@version", pzVer) + 'db.AddParameter("@create_time", createTime) + + ' 使用明确的类型 + db.AddParameter("@hotel_id", hotel_id, DbType.Int32) + db.AddParameter("@roomtype_id", roomtype_id, DbType.Int32) + db.AddParameter("@device_list_json", device_list_json, DbType.String) + db.AddParameter("@version", pzVer, DbType.Int32) + db.AddParameter("@create_time", createTime, DbType.DateTime) + + ' 执行插入操作 + Dim result As Integer = db.ExecuteNonQuery(insertStr) + + db.Close() + + If result > 0 Then + MsgBox("Device list upload successful") + Else + MsgBox("Upload of equipment list failed") + End If + End Using + + Catch ex As Exception + MsgBox($"An error occurred while uploading the device list.: {ex.Message}") + ' 记录详细错误日志 + LogError($"UploadDeviceList error: {ex.Message}{Environment.NewLine}{ex.StackTrace}") + End Try + + + End Sub + + ' JSON验证函数 + + + ' 日志记录函数 + Private Sub LogError(message As String) + Dim logPath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ErrorLog.txt") + + Try + File.AppendAllText(logPath, $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}{Environment.NewLine}{Environment.NewLine}") + Catch + ' 日志写入失败时不抛出异常 + End Try + End Sub + + Private Sub ToolStripButton23_Click(sender As Object, e As EventArgs) Handles ToolStripButton23.Click + If Releaseflag And Not IsNothing(TvwMain.SelectedNode) Then + Else + MsgBox("Please select the publishing node.") + Return + End If + Dim TrNode As TreeNode = TvwMain.SelectedNode + + If TrNode.Level > 1 Then + TrNode = TrNode.Parent + End If + Dim FirmwareVer As String = TrNode.FirstNode.NextNode.NextNode.Text ' TrNode.NextVisibleNode.NextNode.Text + Dim FVer As Integer = 0 + If Not String.IsNullOrEmpty(FirmwareVer) Then + Dim Firbuf As String() = FirmwareVer.Split("_") + If Firbuf.Length > 3 Then + FVer = Convert.ToInt32(Firbuf(3), 16) + End If + End If + UploadDeviceList1(FVer) + + + + End Sub + Public Sub UploadDeviceList1(pzVer As Integer) + Dim headnode As RowNode + headnode = _grdModel._rootNode + Dim childnode, D485node, Virtualnode As RowNode + '初始化treeview控件 + + Console.WriteLine("初始化treeview控件") + + ' 1. 参数验证 + If IsNothing(TvwMain.SelectedNode) Then + MsgBox("Please select the publishing node.") + Return + End If + childnode = headnode.Nodes(0) + childnode = childnode.Nodes(0) + + D485node = childnode.Nodes(1) + Virtualnode = childnode.Nodes(2) + + If IsNothing(_grdModel) OrElse IsNothing(_grdModel._rootNode) Then + MsgBox("No model selected") + Return + End If + Dim li As List(Of UpdataDevnode) = New List(Of UpdataDevnode) + Dim hnode As UpdataDevnode = Extractnode(childnode, True) + li.Add(hnode) + For Each node In D485node.Nodes + + For Each node2 In node.Nodes + li.Add(Extractnode(node2)) + Next + + + Next + For Each node In Virtualnode.Nodes + For Each node2 In node.Nodes + li.Add(Extractnode(node2)) + Next + Next + + Try + + + + ' 3. 序列化 JSON + Dim device_list_json As String = JsonConvert.SerializeObject(li) + + + + Dim hotel_id As Integer = _project.HotelIndex + Dim roomtype_id As Integer = _project.RoomType(g_CurrentTreeNodeRoomTypeItemIndex).structRoomType_ID + Dim createTime As String = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + + ' 5. 使用参数化查询 + Dim insertStr As String = "INSERT INTO `blv_rcu_db`.`tbl_room_type_device` " & + "(`hotel_id`, `roomtype_id`, `device_list_json`, `version`, `create_time`,`format`) " & + "VALUES (@hotel_id, @roomtype_id, @device_list_json, @version, @create_time,@format)" + + Using db As New DbExecutor(DbExecutor.DbTypeEnum.Mysql, DbConnString) + db.Open() + + ' 清空可能存在的旧参数 + db.ClearDbParameter() + + '' 使用新的AddParameter方法添加参数 + 'db.AddParameter("@hotel_id", hotel_id) + 'db.AddParameter("@roomtype_id", roomtype_id) + 'db.AddParameter("@device_list_json", device_list_json) + 'db.AddParameter("@version", pzVer) + 'db.AddParameter("@create_time", createTime) + + ' 使用明确的类型 + db.AddParameter("@hotel_id", hotel_id, DbType.Int32) + db.AddParameter("@roomtype_id", roomtype_id, DbType.Int32) + db.AddParameter("@device_list_json", device_list_json, DbType.String) + db.AddParameter("@version", pzVer, DbType.Int32) + db.AddParameter("@create_time", createTime, DbType.DateTime) + db.AddParameter("@format", 0, DbType.Int32) + ' 执行插入操作 + Dim result As Integer = db.ExecuteNonQuery(insertStr) + + db.Close() + + If result > 0 Then + MsgBox("The equipment list has been uploaded successfully.") + Else + MsgBox("The equipment list upload failed.") + End If + End Using + + Catch ex As Exception + MsgBox($"An error occurred while uploading the device list: {ex.Message}") + ' 记录详细错误日志 + LogError($"UploadDeviceList error: {ex.Message}{Environment.NewLine}{ex.StackTrace}") + End Try + + + End Sub + Public Function Extractnode(node As RowNode, Optional isRoot As Boolean = False) As UpdataDevnode + + + Dim updataDevnode As UpdataDevnode = New UpdataDevnode + updataDevnode.DevName = node.Text + + updataDevnode.DevAttr = New Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, String))) + updataDevnode.DevFunc = New Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, (String, String))))) + + ''遍历节点默认第一个节点为设备属性 + For i As Integer = 0 To node.Nodes.Count - 1 + If i = 0 Then + Dim attr As Dictionary(Of String, Dictionary(Of String, String)) = New Dictionary(Of String, Dictionary(Of String, String)) + updataDevnode.DevAttr.Add(node.Nodes(i).Text, attr) + For j As Integer = 0 To node.Nodes(i).Nodes.Count - 1 + Dim attr2 As Dictionary(Of String, String) = New Dictionary(Of String, String) + attr.Add(node.Nodes(i).Nodes(j).name, attr2) + '继续遍历子节点 + For k As Integer = 0 To node.Nodes(i).Nodes(j).Nodes.Count - 1 + attr2.Add(node.Nodes(i).Nodes(j).Nodes(k).name, node.Nodes(i).Nodes(j).Nodes(k).devicetype.ToString) + Next + Next + Else + '判断节点名称不能为"RS485"、"VirtualObject" + If node.Nodes(i).name <> "RS485" AndAlso node.Nodes(i).name <> "VirtualObject" Then + '遍历节点的子节点 + Dim devtype As String = "0" + Dim addr As String = "0" + Dim tnodename As String + If isRoot Then + '"设备存在组:DO设备组信息" + tnodename = $"{node.Nodes(i).name} device group information" + If updataDevnode.DevAttr.Values(0).ContainsKey(tnodename) Then + + If updataDevnode.DevAttr.Values(0)(tnodename).ContainsKey("DeviceType") Then + devtype = updataDevnode.DevAttr.Values(0).Item(tnodename).Item("DeviceType") + End If + If updataDevnode.DevAttr.Values(0)(tnodename).ContainsKey("DeviceAddr") Then + addr = updataDevnode.DevAttr.Values(0).Item(tnodename).Item("DeviceAddr") + End If + + End If + Else + devtype = node.Nodes(i).DEV_TYPE_DATA + tnodename = "Device present" + If updataDevnode.DevAttr.Values(0)(tnodename).ContainsKey("Dialing address") Then + addr = updataDevnode.DevAttr.Values(0).Item(tnodename).Item("Dialing address") + End If + + End If + + Dim func1 As New Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, (String, String)))) + Dim func2 As New Dictionary(Of String, Dictionary(Of String, (String, String))) + Dim func As New Dictionary(Of String, (String, String)) + ' 功能块名 , 类型值 , 功能块地址 别名,序号 + ' Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, String))) + func2.Add(addr, func) + func1.Add(devtype, func2) + updataDevnode.DevFunc.Add(node.Nodes(i).Text, func1) ' (devtype, func)) + + 'Dim tag As AttributeRowNodeTag = node.Tag + + For j As Integer = 0 To node.Nodes(i).Nodes.Count - 1 + + func.Add(node.Nodes(i).Nodes(j).index + 1, (node.Nodes(i).Nodes(j).Text, node.Nodes(i).Nodes(j).deviceAlias)) + + Next + End If + + End If + + + Next + Return updataDevnode + End Function @@ -4931,3 +5242,15 @@ Public Class RoomType ' Public Property RoomType_OldID As String End Class + + +Public Class UpdataDevnode + '设备名称 + Public Property DevName As String + '设备属性列表 + Public Property DevAttr As Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, String))) + ' 功能块名 , 类型值 , 功能块地址 序号 回路名 别名 + Public Property DevFunc As Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, Dictionary(Of String, (String, String))))) + +End Class + diff --git a/BLV_Studio/Test/GridTest/ReportingScenario.vb b/BLV_Studio/Test/GridTest/ReportingScenario.vb index cf05aac..4cce31e 100644 --- a/BLV_Studio/Test/GridTest/ReportingScenario.vb +++ b/BLV_Studio/Test/GridTest/ReportingScenario.vb @@ -16,6 +16,10 @@ Public Class ReportingScenario 'Runing(grd, Devicemodel, ActionConfiguration) End Sub + Sub New(grd As FlexCell.Grid, Devicemodel As Dictionary(Of String, DeviceModel)) + Tgrd = grd + TDevicemodel = Devicemodel + End Sub '配置名称 Public ConfigurationName As String '配置版本 diff --git a/BLV_Studio/Test/GridTest/TableInteraction.vb b/BLV_Studio/Test/GridTest/TableInteraction.vb index 2d00569..d40f267 100644 --- a/BLV_Studio/Test/GridTest/TableInteraction.vb +++ b/BLV_Studio/Test/GridTest/TableInteraction.vb @@ -7141,6 +7141,10 @@ ON DUPLICATE KEY UPDATE {updatastr};" GetAccountAuth(nsurl, str) Return aaa End Function + Public Function TestReportingScenario1() As ReportingScenario + Dim aaa As New ReportingScenario( _grd, Dic_Devicemodel) + Return aaa + End Function Private Function GetAccountAuth(url As String, data As String) As Boolean Dim jsonString As String = HttpMothod.PostData2(url, data) If String.IsNullOrWhiteSpace(jsonString) OrElse jsonString.ToUpper.Contains("False".ToUpper) Then diff --git a/BLV_Studio/bin/Debug/BLV_Studio.xml b/BLV_Studio/bin/Debug/BLV_Studio.xml index f9c3f8f..86674d9 100644 --- a/BLV_Studio/bin/Debug/BLV_Studio.xml +++ b/BLV_Studio/bin/Debug/BLV_Studio.xml @@ -7452,6 +7452,33 @@ BLV_Studio 回收资源 + + + 添加参数到命令(简化版本,自动推断参数类型) + + 参数名称(需包含@或:前缀) + 参数值 + 创建的DbParameter对象 + + + + 添加参数到命令(指定明确的类型) + + 参数名称 + 参数值 + 参数的数据类型 + 创建的DbParameter对象 + + + + 添加参数到命令(包含方向) + + 参数名称 + 参数值 + 参数的数据类型 + 参数方向(输入/输出) + 创建的DbParameter对象 + 查询指定数据表的信息 diff --git a/BLV_Studio/obj/Debug/BLV_Studio.xml b/BLV_Studio/obj/Debug/BLV_Studio.xml index f9c3f8f..86674d9 100644 --- a/BLV_Studio/obj/Debug/BLV_Studio.xml +++ b/BLV_Studio/obj/Debug/BLV_Studio.xml @@ -7452,6 +7452,33 @@ BLV_Studio 回收资源 + + + 添加参数到命令(简化版本,自动推断参数类型) + + 参数名称(需包含@或:前缀) + 参数值 + 创建的DbParameter对象 + + + + 添加参数到命令(指定明确的类型) + + 参数名称 + 参数值 + 参数的数据类型 + 创建的DbParameter对象 + + + + 添加参数到命令(包含方向) + + 参数名称 + 参数值 + 参数的数据类型 + 参数方向(输入/输出) + 创建的DbParameter对象 + 查询指定数据表的信息