【发布时间】:2016-01-07 16:28:34
【问题描述】:
对于这种格式,我深表歉意。我是编程新手,也是这个网站的新手,所以我会尽量把问题说清楚。
我有一个用于访问/修改客户数据库的网络表单。我有一个用于输入新客户详细信息的按钮,该按钮将通过从数据库中获取最高 ID 号并加一(并发布到表单文本框)来自动分配一个 ID 号。
这是我写的代码:
protected void btnNew_Click(object sender, EventArgs e)
{
Clear();
command.Connection = conn;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "NewCustomer";
conn.Open();
SqlParameter maxid = new SqlParameter();
maxid.ParameterName = "@MaxID";
maxid.SqlDbType = SqlDbType.Int;
maxid.Direction = ParameterDirection.Output;
command.Parameters.Add(maxid);
command.ExecuteNonQuery();
NewCustId = Convert.ToInt32(maxid.Value);
NewCustId += 1;
txtCustID.Text = (NewCustId).ToString();
txtCustID.DataBind();
conn.Close();
}
这是存储过程:
CREATE PROCEDURE NewCustomer
(@MaxID INT OUTPUT)
AS
BEGIN
SELECT @MaxID = MAX(CustID)
FROM dbo.Customer
END
我尝试了许多不同的编码方式,但似乎没有任何效果。
我发布的代码在ExecuteNonQuery 有一个异常,说提供了参数并且过程没有参数。当我将command.Parameters.Add(maxid); 放在ExecuteNonQuery 下方时,它返回一个1。
我单独运行 SQL 查询以查看会发生什么,它在未命名的单元格中返回正确答案。由于某种原因,列名出现时会消失。然后,当我尝试使用 C# 代码访问未命名的单元格时,我似乎无法访问它,因为“CustID”列“不存在”。
通过这段代码,我知道SQL命令正在执行,然后C#代码加1,但是我得到的返回值好像是0。
我很感激任何关于如何解决这个问题的想法。谢谢。
编辑:我也试过: 数据表表 = 新数据表(); 适配器。填充(表); NewCustId = table.Rows[0].Field("CustID");
(这里说“CustID”列不存在)
【问题讨论】:
-
一句话:不要这样做!这将不在繁忙的系统中可靠地工作 - 你会得到重复 b> 迟早!相反,请使用 SQL Server 自身更新的
INT IDENTITY列的 SQL Server 内置机制,并确保不要两次使用任何值..... -
这行
txtCustID.DataBind();有什么用处,你已经在txtCustID.Text = (NewCustId).ToString();这里为文本框赋值,你可以使用txtCustID.Text = Convert.ToString(NewCustId); -
我知道您发布了几个“解决方案”,但您应该阅读并注意来自@marc_s 的警告。你正在做的事情将会失败并在未来造成巨大的痛苦。
-
你需要做的就是以下,编辑你的存储过程
SELECT @MaxID = MAX(CustID) FROM dbo.Customer -
@marc_s 谢谢你的提示。我知道为繁忙的数据库制作唯一 ID 是一种不可靠的方式。不幸的是,我对自动 ID 系统并不熟悉,因为我只是这方面的学生。
标签: c# asp.net sql-server stored-procedures parameters