C# 将表达式转换为数据类型nvarchar时出现算术溢出错误

C# 将表达式转换为数据类型nvarchar时出现算术溢出错误,c#,asp.net,.net,sql,sql-server-express,C#,Asp.net,.net,Sql,Sql Server Express,我正在创建一个帮助台系统,但似乎遇到了一个小问题,当用户单击按钮“预注册”帮助台票证号码时,我的脚本将启动到SQL Express服务器,创建一个新行->获取行ID->使用行ID创建最终票证参考(以RAD000001格式,例如第1行)这个过程对我来说似乎很好,直到我到达第9位。。。当用户单击“创建新票证参考”按钮(生成票证编号10)时,我得到以下错误: Arithmetic overflow error converting expression to data type nvarchar.

我正在创建一个帮助台系统,但似乎遇到了一个小问题,当用户单击按钮“预注册”帮助台票证号码时,我的脚本将启动到SQL Express服务器,创建一个新行->获取行ID->使用行ID创建最终票证参考(以RAD000001格式,例如第1行)这个过程对我来说似乎很好,直到我到达第9位。。。当用户单击“创建新票证参考”按钮(生成票证编号10)时,我得到以下错误:

Arithmetic overflow error converting expression to data type nvarchar.
它创建了行,但在更新时似乎失败了(创建了行,返回了ID,然后根据ID创建了ref)

我的SQL表如下所示:

CREATE TABLE [dbo].[tickets](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [ticket_ref] [varchar](15) NULL,
    [details_id] [int] NULL,
    [state] [int] NULL,
    [create_date_Time] [datetime] NOT NULL,
    [details_subject] [varchar](255) NULL,
    [details_main_body] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
<asp:Parameter DefaultValue="0" Direction="Output" Name="ticket_id" />
这就是隐藏的c代码:

private string Reform_TicketId(string original_ticket_id)
{
    switch (original_ticket_id.Length)
    {
        case 1:
            return "RAD00000" + original_ticket_id.ToString();
        case 2:
            return "RAD0000" + original_ticket_id.ToString();
        case 3:
            return "RAD000" + original_ticket_id.ToString();
        case 4:
            return "RAD00" + original_ticket_id.ToString();
        case 5:
            return "RAD0" + original_ticket_id.ToString();
        case 6:
            return "RAD" + original_ticket_id.ToString();
        default:
            return "ERROR!";
    }
}

protected void DsCreateTicketEntry_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
    string original_id = e.Command.Parameters["@ticket_id"].Value.ToString();
    string reformed_id = Reform_TicketId(original_id.ToString()).ToString();

    if (original_id != "0")
    {
        //It has returned a value that is a DB ID field and seems correct! lets proceed!
        DsCreateTicketEntry.UpdateParameters["ticket_db_id"].DefaultValue = original_id;
        //DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = reformed_id;
        DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = "RAD000002";
        DsCreateTicketEntry.Update();
        LblTicketOutput.Text = reformed_id;
    }
    else
    {
        //@TODO: Write to the label stating we had problems generating a Ticket ID!
    }
}

protected void btnCreateTicket_Click(object sender, EventArgs e)
{
    DsCreateTicketEntry.Insert();
    btnCreateTicket.Enabled = false;
}
使用my SQLDataSource中的以下查询:

InsertCommand="INSERT INTO tickets(state, create_date_Time) VALUES (1,GETDATE()) SET @ticket_id=SCOPE_IDENTITY();"    
UpdateCommand="UPDATE tickets SET ticket_ref = @new_ticket_id WHERE (id = @ticket_db_id)"

希望有人能让我明白我错在哪里!?我整天都在看这段代码,它稍微超出了我的学习范围…

这并不是解决您问题的确切方法,但如果您可以将表重新定义为:

...

    Id int identity not null,
    Ticket_ref as 'RAD'+replicate('0', 5-len(cast(Id as varchar)))+Cast(Id as Varchar) persisted,
...

您可能会在不必要的代码上删除很多行…

这不是问题的确切解决方案,但如果您可以将表重新定义为:

...

    Id int identity not null,
    Ticket_ref as 'RAD'+replicate('0', 5-len(cast(Id as varchar)))+Cast(Id as Varchar) persisted,
...

您将在不必要的代码上删除许多行…

您需要将@ticket\u id定义为输出参数,并且在SET语句之前可能需要一个分号

使用:

格式化您的票号。注意,在我的示例中,ticket_id是一个整数


作为一般建议,我一般避免使用SQLDataSource和该设计模式。现在有更好、更优雅的数据访问解决方案。看一看。EF将使您快速启动并运行,代码中没有嵌入SQL语句。您可以从DB生成实体类,甚至可以使用代码优先方法从类生成DB架构。

您需要将@ticket\u id定义为输出参数,并且在SET语句之前可能需要分号

使用:

格式化您的票号。注意,在我的示例中,ticket_id是一个整数


作为一般建议,我一般避免使用SQLDataSource和该设计模式。现在有更好、更优雅的数据访问解决方案。看一看。EF将使您快速启动并运行,代码中没有嵌入SQL语句。您可以从DB中生成实体类,甚至可以使用代码优先的方法从类中生成DB模式。

在Saille的回答之后,我回顾了我的代码,注意到我声明@ticket\u id的地方,我是这样声明的:

CREATE TABLE [dbo].[tickets](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [ticket_ref] [varchar](15) NULL,
    [details_id] [int] NULL,
    [state] [int] NULL,
    [create_date_Time] [datetime] NOT NULL,
    [details_subject] [varchar](255) NULL,
    [details_main_body] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
<asp:Parameter DefaultValue="0" Direction="Output" Name="ticket_id" />

在声明“DbType=Int32”之后,如下所示:


一切似乎都正常工作,问题没有解决

虽然我不能100%确定为什么这会引起问题,但有谁能向我解释一下,让我(希望其他人)理解为什么会这样做

另外,我正在使用这个项目学习通用C#/ASP.net(会话等)。一旦完成,1.5版将使用更好的数据库层(如实体)构建…我仍然有点n00b

谢谢大家的帮助


汤姆。

赛勒回答后,我回顾了我的代码,注意到我在声明@ticket\u id的地方声明如下:

CREATE TABLE [dbo].[tickets](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [ticket_ref] [varchar](15) NULL,
    [details_id] [int] NULL,
    [state] [int] NULL,
    [create_date_Time] [datetime] NOT NULL,
    [details_subject] [varchar](255) NULL,
    [details_main_body] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
<asp:Parameter DefaultValue="0" Direction="Output" Name="ticket_id" />

在声明“DbType=Int32”之后,如下所示:


一切似乎都正常工作,问题没有解决

虽然我不能100%确定为什么这会引起问题,但有谁能向我解释一下,让我(希望其他人)理解为什么会这样做

另外,我正在使用这个项目学习通用C#/ASP.net(会话等)。一旦完成,1.5版将使用更好的数据库层(如实体)构建…我仍然有点n00b

谢谢大家的帮助


Tom.

刚刚注意到一行:DsCreateTicketEntry.UpdateParameters[“new\u ticket\u id”]。DefaultValue=“RAD000002”;这是为了调试而放的,通常我使用的是“reformed_id”变量。哪一行代码给出了这个错误?hi@jams这是这一行:DsCreateTicketEntry.Insert();与其评论代码示例是错误的,为什么不修复代码示例?@AaronBertrand我觉得它显示了iv在运行stackoverflow之前试图自己调试该问题,并且即使使用上述调试代码,错误仍然存在。只注意到行:dscreateTickententry.UpdateParameters[“new_ticket_id”].DefaultValue=“RAD000002”;这是为了调试而放的,通常我使用的是“reformed_id”变量。哪一行代码给出了这个错误?hi@jams这是这一行:DsCreateTicketEntry.Insert();与其评论代码示例是错误的,为什么不修复代码示例?@AaronBertrand我觉得这表明iv在运行stackoverflow之前试图自己调试该问题,即使使用上述调试代码,错误仍然存在。