0

我正在创建一个帮助台系统,但似乎遇到了一个小问题,当用户单击一个按钮以“预注册”帮助台票号时,我的脚本将触发到 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]

这是后面的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;
}

在我的 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)"

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

4

3 回答 3

2

您需要将 @ticket_id 定义为输出参数,并且您可能需要在 SET 语句之前使用分号。

采用:

String.Format("RAD{0:d6}", ticket_Id)

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

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

于 2012-05-17T01:05:17.943 回答
1

不能完全解决您的问题,但如果您可以将表格重新定义为:

...

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

你会在不必要的代码上写很多行......

于 2012-05-16T23:07:56.440 回答
0

在 Saille 的回答之后,我查看了我的代码并注意到我声明 @ticket_id 的地方是这样声明的:

<asp:Parameter DefaultValue="0" Direction="Output" Name="ticket_id" />

在声明“DbType = Int32”之后:

<asp:Parameter DefaultValue="0" Direction="Output" DbType=Int32 Name="ticket_id" />

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

虽然我不是 100% 确定这为什么会导致问题,但有没有人能够向我解释这一点,让我(以及希望其他人)理解为什么这样做......

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

感谢所有的帮助家伙!

汤姆。

于 2012-05-17T07:06:37.713 回答