【问题标题】:How do I add parameters to the code in ASP.NET page如何在 ASP.NET 页面的代码中添加参数
【发布时间】:2015-12-12 03:00:38
【问题描述】:

需要在 tblMeetings 表中添加一条记录,然后将 tblMeetings 中的那个 ID 列(PK,Int,非空)添加到 tblVotings 表的 Meeting_ID 列(int,非空)。前 2 个查询代码块有效!最后一个受保护的子“ftrInsert_Click”块在我试图将参数从一个表传递到另一个表时不起作用。我没有收到错误,并且记录插入到 tblMeetings 但不是 tblVotings。 我的整个 aspx.vb 页面代码:

Imports System
Imports System.Data
Imports System.Data.SqlClient

Partial Class _NewMeetings
Inherits System.Web.UI.Page

Dim WithEvents ftrInsert As New Button

Protected Sub GridView2_RowCommand(ByVal sender As System.Object, ByVal e As           System.Web.UI.WebControls.GridViewCommandEventArgs)
    If e.CommandName = "ftrInsert" Then
        'call the insert sub (sender is the gridview that called the rowCommand, 
        'UsersDS is the name of our sqlDataSource on the page
        gvQuickInsert(sender, SqlDataSource2)
    End If
End Sub

Protected Sub gvQuickInsert(ByRef gv As GridView, ByRef ds As SqlDataSource)
    Dim paramsArr As ArrayList = New ArrayList
    Dim controlsArr As ArrayList = New ArrayList
    Dim col As Integer = 0
    Dim footrow As GridViewRow = gv.FooterRow

    Try
        Dim ix As Integer = 0
        For ix = 0 To gv.Columns.Count
            Dim d As DataControlField = gv.Columns(ix)
            If d.InsertVisible = True Then
                If footrow.Cells(ix).Controls(1) IsNot Nothing Then
                    paramsArr.Add(d.SortExpression.ToString)
                controlsArr.Add(footrow.Cells(ix).Controls(1))
                End If
            End If
        Next
    Catch ex As Exception
    End Try

    ds.InsertParameters.Clear()

    Dim ii As Integer = 0
    For Each contr As Object In controlsArr
        If contr.GetType.Name.ToLower.Contains("textbox") Then
            ds.InsertParameters.Add(paramsArr(ii), TryCast(contr, TextBox).Text)
        ElseIf contr.GetType.Name.ToLower.Contains("dropdownlist") Then
            ds.InsertParameters.Add(paramsArr(ii), _
          TryCast(contr, DropDownList).SelectedValue)
        ElseIf contr.GetType.Name.ToLower.Contains("checkbox") Then
            If TryCast(contr, CheckBox).Checked Then
                ds.InsertParameters.Add(paramsArr(ii), 1)
            Else
                ds.InsertParameters.Add(paramsArr(ii), 0)
            End If
        End If
        ii = ii + 1
    Next
    ds.Insert()
    gv.DataBind()
End Sub
Protected Sub ftrInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ftrInsert.Click

    Dim strConnection As String = ConfigurationManager.ConnectionStrings("ServiceLine_CommitteeConnectionString").ConnectionString
    Using con As New SqlConnection(strConnection)

        'Dim cmd As New SqlCommand("INSERT INTO tblVotings VALUES (@
        Dim Meeting_ID As New SqlParameter("@ID", SqlDbType.Int)
        Dim Committee_ID As New SqlParameter("@Comm", SqlDbType.Int)
        Dim Member_Name As New SqlParameter("@Member", SqlDbType.NVarChar)

        'Dim con As New SqlConnection(strConnection)
        Dim cmd As New SqlCommand("INSERT INTO tblVotings(Meeting_ID, Committee_ID, Member_Name) SELECT M.ID AS Meeting_ID, C.ID AS Committee_ID, CM.Full_Name AS Member_Name FROM tblCommitteeName AS C INNER JOIN tblMeetings AS M ON M.ContractCategory = C.Contract_Category AND M.Committee = C.Committee_Name INNER JOIN tblCommitteeMembers AS CM ON CM.Committee = M.Committee WHERE (M.ID IN (@ID)) and (C.ID IN (@Comm)) and (CM.Full_Name IN (@Member))", con)

        Meeting_ID.Value = 1
        Committee_ID.Value = 1
        Member_Name.Value = 1

        cmd.Parameters.Add(Meeting_ID)
        cmd.Parameters.Add(Committee_ID)
        cmd.Parameters.Add(Member_Name)
        cmd.Connection = con

        cmd.CommandType = CommandType.Text

        If con.State <> ConnectionState.Open Then con.Open()

        Dim result As Integer = cmd.ExecuteNonQuery()
        If con.state = ConnectionState.Open Then con.Close()
    End Using
End Sub

结束类

【问题讨论】:

  • 您的选择参数似乎有问题。 SELECT C.ID, M.ID, CM.FULL_NAME 看起来不像 insert into tblVotings(Meeting_ID, Committee_ID, Member_Name)。假设C.IDtblCommitteeNameIDM.IDIDtblMeetings。我不确定这是否是您要解决的问题,但这只是我注意到的问题。
  • 谢谢。我修复了插入语句。现在我只需要知道如何输入会议 ID 的参数。

标签: asp.net vb.net visual-studio-2012


【解决方案1】:

在 SQL 语句中使用参数是相当简单的,但是您必须记住一些规则。

  1. 参数必须按照它们在 SQL 语句中出现的顺序添加到命令中
  2. 参数名称必须完全匹配它们在 SQL 中的引用方式
  3. 参数大小应与数据库中给出的值相匹配。对数字不是很重要,但对字符串非常重要。

最常见的是 SQL 参数新手会遇到的三个问题。

这是一个使用 SQL 参数的示例,您应该能够对其进行剖析以获得所需的内容。

Dim strConnection As String = "ConnString"
Using con As New SqlConnection(strConnection)
    Dim cmd As New SqlCommand("INSERT INTO tbl(Col1) VALUES (@p_Para1)", con)
    Dim p As New SqlParameter("@p_Para1", SqlDbType.Int, 8)
    p.value = 1
    cmd.Parameters.Add(p)

    cmd.CommandType = CommandType.Text

    If con.State <> ConnectionState.Open Then con.Open()

    cmd.ExecuteNonQuery()

    If con.State = ConnectionState.Open Then con.Close()
End Using

您的第二个错误(“无效的列名'Meeting_ID'。无效的列名'Committee_ID'。无效的列名'Member_Name'。”)我认为是因为您设置WHERE子句的方式。

所以而不是:

INSERT INTO tblVotings(Meeting_ID, Committee_ID, Member_Name) 
    SELECT M.ID AS Meeting_ID, C.ID AS Committee_ID, CM.Full_Name AS Member_Name 
    FROM tblCommitteeName AS C INNER JOIN tblMeetings AS M ON M.ContractCategory = C.Contract_Category AND M.Committee = C.Committee_Name INNER JOIN tblCommitteeMembers AS CM ON CM.Committee = M.Committee 
    WHERE (Meeting_ID IN (@ID)) and (Committee_ID IN (@Comm)) and (Member_Name IN (@Member))

试试:

INSERT INTO tblVotings(Meeting_ID, Committee_ID, Member_Name) 
    SELECT M.ID AS Meeting_ID, C.ID AS Committee_ID, CM.Full_Name AS Member_Name 
    FROM tblCommitteeName AS C INNER JOIN tblMeetings AS M ON M.ContractCategory = C.Contract_Category AND M.Committee = C.Committee_Name INNER JOIN tblCommitteeMembers AS CM ON CM.Committee = M.Committee 
    WHERE (M.ID IN (@ID)) and (C.ID IN (@Comm)) and (CM.Full_Name IN (@Member))

【讨论】:

  • 那不是 c# 或 c++ 代码吗?我需要基于VB的参数。
  • 另外,我可以只为 Meeting_ID 创建一个参数,还是必须为所有插入的字段创建一个参数?
  • 例子在VB中。我只包含了相关部分,因此您需要将该 sn-p 放入您的函数中。您需要为正在执行的 SQL 字符串中的每个参数创建一个 SqlParameter 变量。因此,如果您要插入 4 个值并希望每个值都作为参数,那么您需要实例化 4 个 SqlParameter 变量并将每个变量添加到 SqlCommand 上的 Parameters 集合中
  • 我使用了您发布的代码。我已经在顶部编辑了我的代码,因此您可以看到它以及我现在收到的错误。
  • Dee:您遇到的错误是因为您没有为参数提供值。取消注释这些行,并使用给您的错误更新您的问题。
猜你喜欢
  • 1970-01-01
  • 2016-02-17
  • 2018-04-26
  • 1970-01-01
  • 2013-11-07
  • 2012-01-04
  • 1970-01-01
  • 2013-03-08
  • 2014-01-18
相关资源
最近更新 更多