【问题标题】:Converting textbox string to Integer prior to inserting into database ASP.NET VB.NET在插入数据库 ASP.NET VB.NET 之前将文本框字符串转换为整数
【发布时间】:2016-03-02 06:14:15
【问题描述】:

我有一个网页,它在页面上显示了几个不同的网格视图和详细视图。我在网格视图中使用选择列来获取特定的单元格值并将其提供给 asp 标签。我正在尝试从标签中获取值并在我的 sql 查询中使用它,该查询将 'yes' 插入数据库中,基于将哪个值提供给标签,但是在执行查询时我不断收到错误的语法错误。

为了给您提供更多背景信息,我有两种类型的用户,学生和企业。网格视图显示来自学生用户的提交信息,然后商业用户可以选择这些信息作为获胜提交。我输入 asp 标签的列是提交 id 号 (PK),它是数据库中的一个 int。根据提交 ID,业务用户可以选择通过单击启动我的 sql 命令以插入数据库的 asp 按钮将所选提交标记为获胜提交。我不确定使用什么转换方法来完成这项任务。

这是我的代码:

Imports System.Data

Partial Class InteriorBusinessProjectDetails
    Inherits System.Web.UI.Page
    Dim conn As New Data.SqlClient.SqlConnection("DatabaseConnetionString")

    Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
        ' Get the currently selected row using the SelectedRow property.
        Dim row As GridViewRow = GridView1.SelectedRow

        lblSelectSubmission.Visible = True
        lblSubmission.Visible = True
        lblSubmissionID.Visible = True
        btnSelect.Visible = True
        btnCancel.Visible = True

        lblSubmissionID.Text = row.Cells(0).Text
    End Sub

    Protected Sub btnSelect_Click(sender As Object, e As EventArgs) Handles btnSelect.Click

        Dim SubmissionID As String = lblSubmissionID.Text
        Dim id As Integer = Convert.ToInt32(Convert.ToDecimal(SubmissionID))

        conn.Open()

        Dim cmd As New Data.SqlClient.SqlCommand(("INSERT INTO Submissions (Selected) VALUES ('Yes') WHERE SubmissionID=@SubmissionID"), conn)
        cmd.Parameters.Add("@SubmissionID", SqlDbType.Int).Value = id
        cmd.ExecuteNonQuery()

        conn.Close()

        lblSubmission.Visible = False
        lblSubmissionID.Visible = False
        btnSelect.Visible = False
        btnCancel.Visible = False
        lblSelectSubmission.Visible = True
        lblSelectSubmission.Text = "You have successfully chosen a submission for your project!"

    End Sub
End Class

这里抛出异常:

cmd.Parameters.Add("@SubmissionID", SqlDbType.Int).Value = id
cmd.ExecuteNonQuery()

这是堆栈跟踪:

StackTrace:
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
       at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
       at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
       at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
       at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
       at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
       at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       at InteriorBusinessProjectDetails.btnSelect_Click(Object sender, EventArgs e) in C:\Users\richard\Desktop\BRAINbait PLATINUM 11.24.15\InteriorBusinessProjectDetails.aspx.vb:line 32
       at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
       at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

前端的 GUI 带有我从中提取值的标签,以及启动我的 Click 事件的按钮:

<h2 style="margin-left:auto; margin-right:auto; text-align:center; color:#FF9933;"><asp:Label ID="lblSelectSubmission" runat="server" Text="Would you like to choose the following submission for your project?" Visible="false"></asp:Label></h2>
        <h2 style="margin-left:auto; margin-right:auto; text-align:center; color:#FF9933;"><asp:Label ID="lblSubmission" runat="server" Text="Submission Number: " Visible="false"></asp:Label><asp:Label ID="lblSubmissionID" runat="server" Text="" Visible="false"></asp:Label></h2>
        <center><asp:Button ID="btnSelect" runat="server" Text="Select" CssClass="submit" TabIndex="0" Visible="false" /><asp:Button ID="btnCancel" runat="server" Text="Cancel" CssClass="submit" TabIndex="1" Visible="false" /></center> 

【问题讨论】:

    标签: sql asp.net vb.net gridview type-conversion


    【解决方案1】:

    您可以使用Val()

    Val() - 将字符串中包含的数字作为适当类型的数值返回。

     Dim id As Integer = val(lblSubmissionID.Text)
    

    和 imo,Dim SubmissionID As String = lblSubmissionID.Text 是不需要的


    我怀疑真正的问题在于您的查询计划,即

    insert into submissions(selected) ('Yes') WHERE submissionid=1 不是有效的插入语句,您需要在此处使用UPDATE

    Protected Sub btnSelect_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSelect.Click
            Dim id As Integer = Val(lblSubmissionID.Text)
            conn.Open()
            Dim cmd As New Data.SqlClient.SqlCommand(("update Submissions  set Selected='Yes' WHERE SubmissionID=@SubmissionID"), conn)
            cmd.Parameters.Add("@SubmissionID", SqlDbType.Int).Value = id
            cmd.ExecuteNonQuery()
            conn.Close()
            lblSubmission.Visible = False
            lblSubmissionID.Visible = False
            btnSelect.Visible = False
            btnCancel.Visible = False
            lblSelectSubmission.Visible = True
            lblSelectSubmission.Text = "You have successfully chosen a submission for your project!"
        End Sub
    

    【讨论】:

    • 使用Dim id As Integer = val(lblSubmissionID.Text)cmd.Parameters.Add("@SubmissionID", id) 作为我的参数仍然得到同样的错误。
    • @NOSDUH 确切的错误是什么???并告诉我lblSubmissionID.Text中的值
    • @NOSDUH 是的,我可以看到那b,但我不想分析堆栈跟踪向我显示确切的错误消息
    • @NOSDUH 您将在变量id 中获得什么值以及在lblSubmissionID 中获得什么值
    • Dim cmd As New Data.SqlClient.SqlCommand((" update Submissions set Selected='Yes' WHERE SubmissionID=@SubmissionID"), conn)
    【解决方案2】:

    Convert.ToInt16(idrow.Cells(0).Text) 将单元格转换为int

    cmd.Parameters.Add("@SubmissionID", Convert.ToInt16(idrow.Cells(0).Text))
    

    cmd.Parameters.Add("@SubmissionID", Id))
    

    如果 Id 已经是整数

    【讨论】:

    • 我不是直接从网格中获取单元格值。我正在使用基于业务用户选择的行从网格提供的 label.Text 值。所以第一个选项行不通。至于第二个,我仍然得到同样的错误。
    • 然后把idrow.Cells(0).Text改成label.Text
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 2021-12-18
    • 1970-01-01
    • 2012-10-25
    • 2022-12-19
    • 2020-04-01
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多