2015-12-03 55 views
0

我试图用C#和ASP.NET中的存储过程更新表。我有一个自增量值表@ticketnumber麻烦正确地将字符串转换为INT与SQL,C#,ASP

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

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

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

不能隐式转换字符串类型为int

然后我周围有点混乱,并得到了错误消失的错误。当我运行我的代码时,我会输入值,但Visual Studio然后会抛出“输入字符串不正确的格式”错误

为了澄清,我的存储过程插入工作得很好,但我不能使用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创建一个文本框,并能够使用该用户输入来更新数据库。

在此先感谢。

+0

总是使用TryParse –

+0

你的主要问题似乎是:你需要**将'ticketnumber'传递给你的更新存储过程 - 并且更新将* * NOT **产生一个新的“ID” - 你只是**更新**现有的行 - 所以使用SCOPE_IDENTITY并返回一个ID在这里毫无意义...... –

回答

0

我不能说出什么类型的ticketnumberbox是,但如果它是一个文本框,你需要解析Text属性的值,而不是在对象上调用.ToString()

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

编辑 我觉得有几个问题,第一你@ticketnumber PARAM可能需要在输入和输出。 更改此行:

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()用另一种方法来得到你所需要的价值。

+0

那么,停止了最初的消息,但现在我的UpdateTicket正在抛出异常消息,同样的错误,输入字符串不正确的格式。 ticketnumberbox是由用户以整数读取的文本框。 – walangala

1

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

0
ticketnumberbor.Text.ToString(); 

试图做到这一点。 或通过电子邮件与我的TeamViewer ID和密码联系,我会尽力帮助你。我的电子邮件是[email protected]。我只想跟踪你的代码,它的值