【问题标题】:Cannot insert duplicate key in object 'dbo.UserInfo'. The duplicate key value is (). The statement has been terminated无法在对象“dbo.UserInfo”中插入重复键。重复键值为 ()。该语句已终止
【发布时间】:2016-06-11 18:54:31
【问题描述】:

在我的 asp 网站中,我有一个注册表单,可以将数据发送到数据库。当用户输入他的数据时,提交后,会出现一个错误,上面写着:

违反主键约束“PK__UserInfo__737584F762CC8D9B”。无法在对象“dbo.UserInfo”中插入重复键。重复键值为 ()。 声明已终止。

这是代码:` signup.aspx.cs-

 protected void submit_Click(object sender, EventArgs e)
{
    string name = Request.Form["name"];
    string email = Request.Form["email"];
    string password = Request.Form["password"];
    string fileName = "Database.mdf";
    string sql = "INSERT INTO UserInfo VALUES('" + name + "','" + email + "','" + password + "')";
    MyAdoHelper.DoQuery(fileName,sql);
}

MyAdoHelper.DoQuery-

public static void DoQuery(string fileName, string sql)
{

    SqlConnection conn = ConnectToDb(fileName);
    conn.Open();
    SqlCommand com = new SqlCommand(sql, conn);
    com.ExecuteNonQuery();
    com.Dispose();
    conn.Close();

}

MyAdoHelper.ConnectToDb-

public static SqlConnection ConnectToDb(string fileName)
{
    string path = HttpContext.Current.Server.MapPath("App_Data/");
    path += fileName;
    //string path = HttpContext.Current.Server.MapPath("App_Data/" + fileName);
    string connString = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = C:\Users\User\Documents\Visual Studio 2015\WebSites\WebSite6\App_Data\Database.mdf; Integrated Security = True";
    SqlConnection conn = new SqlConnection(connString);
    return conn;

}

有人可以帮助我吗? 谢谢!

【问题讨论】:

  • 用户信息表中哪一列是主键?
  • 我认为它的名字是 PRIMARY KEY CLUSTERED ([Name] ASC)
  • 很酷,所以名称是您的主要列!所以你需要按照字符串 sql = "IF NOT EXISTS(SELECT 1 FROM USERINFO WHERE Name='"+name +"' ) BEGIN INSERT INTO UserInfo VALUES('" + name + "','" + email + "' ,'" + 密码 + "') END ";因为它将帮助您检查该名称是否已经存在于您的表中,它会避免您出现该错误!
  • 转到管理工作室探索数据库打开您的数据库并探索表格,然后从下拉列表中右键单击您的表格,然后在打开时点击设计,然后上传该图像

标签: c# sql asp.net visual-studio-2015


【解决方案1】:

我不知道你的架构,但我猜你的 email 变量是空的。

您似乎在 SQL Server 实例中设置了唯一键,并且您第二次尝试使用空值填充该列。

在构建查询时尝试通过添加断点来仔细检查每个变量,以确保客户端以与您预期接收数据相同的格式传递数据。

【讨论】:

  • 我不明白,为什么你会认为电子邮件变量是空的
  • @OplItay 这有点牵强,但我在冒险猜测电子邮件是具有唯一键的列。也有可能是其他人之一。
  • 您能描述一下您的架构以便我们为您提供帮助吗?旁注:我认为是时候开始使用某种 ORM 或至少清理用户输入了。看到你如何与数据层交互令人恐惧
  • 哦,好的,谢谢,但是你能再解释一下我应该怎么做吗?我的 sql 不太好
  • 由于您是新手,我建议尽可能少地验证用户输入以防止 SQL 注入...正确的方法是使用准备好的语句或 ORM。顺便说一句,这不是您收到错误的原因...如果您只想解决描述您的架构的问题,我们可以为您提供帮助
【解决方案2】:

根据错误,它指出您正在尝试在启用主键的列中插入相同的值,这是不允许的,因为它只包含唯一值。

所以你可以尝试以下步骤:

检查表架构并确定哪个列是主列“名称”和“电子邮件”(此处不确定确切的列名称),然后调试多次插入的相同值。

您还可以检查用户是否是主键,然后在后端更改代码中,就好像该用户已经存在然后不要再次插入,否则更新

如果电子邮件是主键,则检查它!

你可以在插入数据之前检查

IF NOT EXISTS(SELECT 1 from tablename where primarycolumn=value)
BEGIN
//insert into this table
END
ELSE
//update it

【讨论】:

  • 对不起,我真的不太了解 sql。我如何检查主列?什么是主键?
  • 很酷,所以名称是您的主要列!所以你需要按照字符串 sql = "IF NOT EXISTS(SELECT 1 FROM USERINFO WHERE Name='"+name +"' ) BEGIN INSERT INTO UserInfo VALUES('" + name + "','" + email + "' ,'" + 密码 + "') END ";因为它将帮助您检查该名称是否已经存在于您的表中,它会避免您出现该错误!
  • 我已经完成了,它没有显示错误(感谢上帝)但我认为它不会将数据插入到表中
  • 如果用户已经存在,它不会插入数据。这是因为您避免了主键列中的重复数据,但您可以更新这些数据!
  • 我删除了主键,所以现在它:CREATE TABLE [dbo].[UserInfo] ( [Name] NVARCHAR (50) NOT NULL, [Email] NVARCHAR (50) NOT NULL, [Password] NVARCHAR (50) NOT NULL );
【解决方案3】:

我将我的 excel 导入文件保存为 CSV,但在我将第一列从 ID 重命名为其他内容之前仍然无法执行此操作,否则文件是 SYLK 格式导致此错误..

https://annalear.ca/2010/06/10/why-excel-thinks-your-csv-is-a-sylk/

【讨论】:

    【解决方案4】:

    我使用的一种骇人听闻的方法是首先不让我的唯一标识符 Username 成为主键,方法是转到 Server Explorer->Data Connections->[My Connection String]->[My Table] 和然后摆脱 T-SQL 中的“主键”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2014-05-04
      相关资源
      最近更新 更多