我正在创建一个帮助台系统,但似乎遇到了一个小问题,当用户点击按钮“预先注册”帮助台票号时,我的脚本会激活到SQL Express服务器,创建一个新行 - >获取行ID - >使用行ID创建最终的票证参考(格式为RAD000001,例如第1行)这个过程似乎对我很好,直到我到达第9号...当用户点击“创建新的票证参考”时“按钮(生成票号10)我收到以下错误:
Arithmetic overflow error converting expression to data type nvarchar.
它会创建行,但似乎在更新时失败(创建行,返回ID,然后从ID创建引用)
我的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)"
有些人能够对我出错的地方有所了解!?我一整天都在看这个代码,它在我的学习联盟之外略有下降......
答案 0 :(得分:2)
您需要将@ticket_id定义为输出参数,在SET语句之前可能需要分号。
使用:
String.Format("RAD{0:d6}", ticket_Id)
格式化您的票号。请注意,在我的示例中,ticket_id是一个整数。
作为一般建议,我通常会避免使用SQLDataSource和那个设计模式。现在有更好,更优雅的数据访问解决方案。看看Entity Framework。 EF将使您快速启动并运行,代码中不会嵌入SQL语句。您可以从数据库生成实体类,甚至可以使用Code First方法从类中生成数据库模式。
答案 1 :(得分:1)
如果您可以将表格重新定义为:
,则不能完全解决您的问题,但它可能会有效...
Id int identity not null,
Ticket_ref as 'RAD'+replicate('0', 5-len(cast(Id as varchar)))+Cast(Id as Varchar) persisted,
...
你会在不必要的代码上放下很多行......
答案 2 :(得分: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" />
所有似乎都正常工作,问题仍未解决!
虽然我不是百分之百地确定为什么这会引起问题,但是有人能够向我解释这一点,允许我(以及其他人)了解为什么这样做了它...
PS。我正在使用这个项目来学习一般的C#/ ASP.net(会话等等)一旦完成,版本1.5将使用更好的数据库层(例如实体)构建...我仍然有点像n00b !
感谢所有帮助人员!
汤姆。