使用SQL、C#、ASP将字符串正确转换为Int时出现问题

本文关键字:Int 问题 转换 SQL ASP 使用 字符串 | 更新日期: 2023-09-27 18:25:23

我正在尝试用C#和ASP中的存储过程更新一个表。NET。

我有一个自增量值为@ticketnumber的表。

我还有一个存储过程,它插入数据并创建ID的下一个值。

我有另一个存储过程,它应该更新此表。

我最初的问题是,我一直得到错误

无法将类型字符串隐式转换为int

然后我搞砸了一点,错误就消失了。当我运行代码时,我会输入值,但Visual Studio会抛出"input String Was Not in the Correct Format"错误

需要说明的是,我要插入的存储过程工作得很好,但我不能使用ID值来更新它

这是我的存储过程代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[StoredProcUpdateTicket]
    @fname nvarchar(50),
    @lname nvarchar(50),
    @email nvarchar(50),
    @severityID bigint,
    @statusID bigint,
    @departmentID bigint,
    @issuetype bigint,
    @issuedesc nvarchar(500),
    @ticketnumber bigint OUTPUT
AS
BEGIN
    UPDATE supporticket
    SET fname = @fname,
        lname = @lname,
        email = @email,
        severityID = @severityID,
        statusID = @statusID,
        departmentID = @departmentID,
        issuetype = @issuetype,
        issuedesc = @issuedesc
    WHERE
        ticketnumber = @ticketnumber
    SET @ticketnumber = SCOPE_IDENTITY()
    RETURN @ticketnumber
END

这是我要更新的C#代码:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.Security;
using System.Data.SqlClient;
namespace TrackIT
{
    public class UpdateTicket
    {
        public string fname { get; set; }
        public string lname { get; set; }
        public string email { get; set; }
        public int statusID { get; set; }
        public string issuedesc { get; set; }
        public int severityID { get; set; }
        public int issuetype { get; set; }
        public int departmentID { get; set; }
        public int ticketnum { get; set; }
        public void Update()
        {
            string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand("StoredProcUpdateTicket"))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter paramFName = new SqlParameter("@fname", SqlDbType.NVarChar, 50);
                    paramFName.Value = fname;
                    cmd.Parameters.Add(paramFName);
                    SqlParameter paramLName = new SqlParameter("@lName", SqlDbType.NVarChar, 50);
                    paramLName.Value = lname;
                    cmd.Parameters.Add(paramLName);
                    SqlParameter paramEmail = new SqlParameter("@email", SqlDbType.NVarChar, 50);
                    paramEmail.Value = email;
                    cmd.Parameters.Add(paramEmail);
                    SqlParameter paramSeverity = new SqlParameter("@severityID", SqlDbType.BigInt);
                    paramSeverity.Value = severityID;
                    cmd.Parameters.Add(paramSeverity);
                    SqlParameter paramStatus = new SqlParameter("@statusID", SqlDbType.BigInt);
                    paramStatus.Value = statusID;
                    cmd.Parameters.Add(paramStatus);
                    SqlParameter paramDepartment = new SqlParameter("@departmentID", SqlDbType.BigInt);
                    paramDepartment.Value = departmentID;
                    cmd.Parameters.Add(paramDepartment);
                    SqlParameter paramissuedesc = new SqlParameter("@issuedesc", SqlDbType.NVarChar, 500);
                    paramissuedesc.Value = issuedesc;
                    cmd.Parameters.Add(paramissuedesc);
                    SqlParameter paramissuetype = new SqlParameter("@issuetype", SqlDbType.BigInt);
                    paramissuetype.Value = issuetype;
                    cmd.Parameters.Add(paramissuetype);
                    SqlParameter paramticketnum = new SqlParameter("@ticketnumber", SqlDbType.BigInt);
                    paramticketnum.Direction = ParameterDirection.Output;
                    paramticketnum.Value = ticketnum;
                    cmd.Parameters.Add(paramticketnum);
                    try
                    {
                        con.Open();
                        cmd.Connection = con;
                        cmd.ExecuteNonQuery();
                        int tickID = Int32.Parse(cmd.Parameters["@ticketnumber"].Value.ToString());
                    }
                    catch (Exception e)
                    {
                        throw new Exception(e.Message.ToString());
                    }
                    finally
                    {
                        cmd.Dispose();
                        con.Close();
                    }
                }
           }
       }
   }
}

最后,我在哪里实现我的更新

    protected void btnUpdate_Click(object sender, EventArgs e)
    {
        upd.ticketnum = Int32.Parse(ticketnumberbox.ToString().Trim());
        upd.fname = fnamebox.Text;
        upd.lname = lnamebox.Text;
        upd.email = emailbox.Text;
        upd.severityID = Convert.ToInt32(listSeverity.SelectedValue);
        upd.statusID = Convert.ToInt32(liststatus.SelectedValue);
        upd.departmentID = Convert.ToInt32(ListDept.SelectedValue);
        upd.issuetype = Convert.ToInt32(Listissuetype.SelectedValue);
        upd.issuedesc = BoxDetails.Text;
        upd.Update();
        uForm.Visible = false;
        UpdateSuccess.Visible = true;
    }

我的问题在于为ticketnumber创建一个文本框,并能够使用该用户输入来更新数据库。

提前谢谢。

使用SQL、C#、ASP将字符串正确转换为Int时出现问题

您正在尝试将控件ticketnumberbox转换为字符串,而不是将其值转换为字符串。

我不知道ticketnumberbox是什么类型,但如果它是一个文本框,则需要解析text属性的值,而不是对对象调用.ToString()

尝试:upd.ticketnum = Int32.Parse(ticketnumberbox.Text.Trim());

编辑我认为首先有几个问题,您的@ticketnumber参数可能需要既是输入又是输出。更改此行:

paramticketnum.Direction = ParameterDirection.OutPut;  

收件人:

paramticketnum.Direction = ParameterDirection.InputOutput;

另一个问题出现在存储过程中。您正在将输出设置为SCOPE_IDENTITY()这将始终返回DBNULL,因为您只是在更新而不是插入。这就是这条线路失败的原因:

int tickID = Int32.Parse(cmd.Parameters["@ticketnumber"].Value.ToString());

尝试:

if (!(cmd.Parameters["@ticketnumber"].Value is DBNull))
{
    int tickID = Int32.Parse(cmd.Parameters["@ticketnumber"].Value.ToString());
}

现在只需使用另一种方法更改SET @ticketnumber = SCOPE_IDENTITY()即可获得所需的值。

ticketnumberbor.Text.ToString();

试着这样做。或者用你的TeamViewer ID和密码通过电子邮件与我联系,我会尽力帮助你。我的电子邮件是xazratbek@gmail.com.我只想跟踪你的代码和它的值