使用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创建一个文本框,并能够使用该用户输入来更新数据库。
提前谢谢。
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.我只想跟踪你的代码和它的值