我正在尝试插入一个新人的数据,我可以在第一次尝试时,但是当第二次尝试时和第二次尝试时错误违反了主键,事实上,每次有人ID(personId)都会增加正在尝试添加新人,因此我意识到错误是主键
表人
strFileToOpen = "/path/FileName.png"
创建和插入新人的方法
CREATE TABLE [dbo].[Person] (
[personID] INT NOT NULL,
[personName] VARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([personID] ASC)
);
任何建议?
答案 0 :(得分:4)
您当前的代码无法再次运行,因为您递增的id
变量是在堆栈上分配的局部变量。方法退出时,堆栈中的所有内容都将被清除。再次单击按钮重新输入方法,但变量重置为零,并且您的增量再次将变量设置为1.因此,personID字段的重复异常。
我建议您更改添加IDENTITY
属性的personID
列
通过这种方式,数据库自己计算要分配给personID
字段的下一个值,并且您不需要记住分配给表的最后一个id(这实际上是不可能以安全的方式实现的)多用户环境)
添加IDENTITY属性后,您可以将数据库指定的值回读到personID
字段,将查询更改为
string command = @"INSERT INTO [Person] ([personName])
OUTPUT INSERTED.personID
VALUES (@name)";
并使用ExecuteScalar
运行查询 int id = Convert.ToInt32(cmd.ExecuteScalar());
答案 1 :(得分:1)
如果您不关心personID
字段的实际价值(您的代码似乎表明了这一点)。而且,只是希望它是唯一的并且增加1。
在说明@Steve指示的内容时,您可以通过以下方式定义表:(在T-SQL中)
CREATE TABLE [dbo].[Person] (
[personID] [int] IDENTITY(1,1) NOT NULL,
[personName] VARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([personID] ASC)
);
这将消除您插入personID的需要
protected void BtnCreate(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection(connectionString);
//command
string command = "INSERT INTO [Person] ([personName]) VALUES (@name)";
SqlCommand cmd = new SqlCommand(command, connection);
cmd.Parameters.AddWithValue("@name", name.Text);
connection.Open();
cmd.ExecuteNonQuery();
connection.Close();
}
答案 2 :(得分:1)
谢谢大家,你的所有答案都是正确的,但是我找到了一个更好的解决方案,我使用id作为静态值初始化至少一个并且放弃了功能,它没有任何错误工作,并按我的意愿工作我感谢你的时间和可用性
我的桌子不需要使用身份,因为我打算每次点击按钮创建新人时输入ID增量
CREATE TABLE [dbo].[Person] (
[personID] INT NOT NULL,
[personName] VARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([personID] ASC)
);
我使用了static int id = -1
,功能不正常
//id to new person
private static int id = -1;
protected void BtnCreate(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection(connectionString);
//command
string command = "INSERT INTO [Person] ([personID], [personName]) VALUES (@id, @name)";
SqlCommand cmd = new SqlCommand(command, connection);
cmd.Parameters.AddWithValue("@id", id++);//id increase
cmd.Parameters.AddWithValue("@name", name.Text);
connection.Open();
cmd.ExecuteNonQuery();
connection.Close();
}
答案 3 :(得分:0)
protected void BtnCreate(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlCommand idcommand = new SqlCommand("select max([personID]) from Person", connection)
//id to new person
int id = ((int)idcommand.ExecuteScalar()) + 1;
//command
string command = "INSERT INTO [Person] ([personID], [personName]) VALUES (@id, @name)";
SqlCommand cmd = new SqlCommand(command, connection);
cmd.Parameters.AddWithValue("@id", id++);//id increase
cmd.Parameters.AddWithValue("@name", name.Text);
cmd.ExecuteNonQuery();
connection.Close();
}