将 int 值添加到数据库给出错误,但字符串值有效

Posted

技术标签:

【中文标题】将 int 值添加到数据库给出错误,但字符串值有效【英文标题】:Adding int value to database giving error, yet string value works 【发布时间】:2016-07-20 17:35:04 【问题描述】:

我目前正在开发一个 MVC 项目,使用实体框架和 SQL Express 服务器。

我正在尝试将用户添加到用户表。用户目前受到以下威胁:

CREATE TABLE [dbo].[Users] (
    [UserID] INT NOT NULL PRIMARY KEY,
    [Admin]  BIT NOT NULL,
);

当我通过下面的函数添加到上表中时:

[HttpPost]
public String AddUser(List<String> values)

    using (DataBASE db = new DataBASE())
    
        Users newUser = new Users();
        newUser.UserID = Int32.Parse(values[0]); //There is correct data stored here as an int value
        newUser.Admin = Boolean.Parse(values[1]); //There is correct data stored here as an bool value
        db.Users.Add(newUser); //The newUser object is correct
        db.SaveChanges(); //The error occurs here
    
    return "success";

编辑,这是请求的用户类(每当存储到数据库中时都会更改为字符串):

[Table("Users")]
public class Users

    [Key]
    public int UserID  get; set;
    public bool Admin  get; set; 

我收到以下错误:

"Cannot insert the value NULL into column UserID, table ‘…\\DATABASE.MDF.dbo.Users';
 column does not allow nulls. INSERT fails.\r\nThe statement has been terminated."

该值不为 NULL,并且数据库连接正确(因为删除功能正常工作,当我闯入该功能时,数据库连接是正确的,并且该功能在通过添加新用户进行更新之前提供正确的数据。

当我将数据库更改为以下内容时:

CREATE TABLE [dbo].[Users] (
    [UserID] NVARCHAR(50) NOT NULL PRIMARY KEY,
    [Admin]  BIT NOT NULL,
);

我使用以下函数添加了一个用户(将上面的函数更改为不传递 int 而是保留字符串值):

[HttpPost]
public String AddUser(List<String> values)

    using (DataBASE db = new DataBASE())
    
        Users newUser = new Users();
        newUser.UserID = values[0]; //There is correct data stored here as an string value
        newUser.Admin = Boolean.Parse(values[1]); //There is correct data stored here as an bool value
        db.Users.Add(newUser); //The newUser object is correct
        db.SaveChanges(); //NO error occurs here
    
    return "success";

这是将用户类更改为字符串以适用于字符串解决方案:

[Table("Users")]
public class Users

    [Key]
    public string UserID  get; set;
    public bool Admin  get; set; 

是否有反对在数据库中使用我不知道的 INT 值?

【问题讨论】:

在你的c#代码中,你的newUser.UserID是什么数据类型? 显示您的Users 课程。并且不相关,但请以单数形式命名您的班级。很可能您的 ID 设置了身份标志。 @Baraa 尝试直接插入,你可能会找到答案 @JohnBus​​tos & Mathew 我已经添加了用户类及其当前类型,目前是一个 int。 @ARUN 手动插入数据库?或者写出我自己的 SQL 语句而不是使用 Add 函数?我手动插入,无论变量是什么,它都可以正常工作。但可能会写出我自己的SQL语句 【参考方案1】:

你应该添加属性

[DatabaseGenerated(DatabaseGeneratedOption.None)]

到您的UserId 属性。它说 EF 应该从属性中获取值,而不是默认数据库级别。

【讨论】:

谢谢...我以为我疯了。这解决了问题。【参考方案2】:
 Users newUser = new Users();
        newUser.UserID = Int32.Parse(values[0]); //There is correct data stored here as an int value
        newUser.Admin = Boolean.Parse(values[1]); //There is correct data stored here as an bool value


        db.Users.Attach(newUser);


        db.Users.Add(newUser); //The newUser object is correct
        db.SaveChanges();

最后一试,我不确定,刚刚想到

如果数据库中已有相同的 id,可能有问题

【讨论】:

很抱歉上述方法不起作用,我刚刚发布了解决问题的方法,但必须执行原始查询。永远不会知道为什么它不起作用。【参考方案3】:

老实说,这不是什么答案。但我能做的最好的事情是解决我的问题,即编写一个原始查询并在下面执行它,它适用于数据库和整个应用程序中的 int 值。我仍然不知道,并且可能永远不会知道,为什么上述函数不适用于 int 值。

        using (DataBASE db = new DataBASE())
        
            try
            
                db.Database.ExecuteSqlCommand("INSERT INTO Users VALUES(0,1)", Int32.Parse(values[0]), Boolean.Parse(values[1]));
                db.SaveChanges();
            
            catch (Exception e)
            
                var exception = e;
            
        

【讨论】:

看看 Kirill Bestemyanov 的回答。 User 的主键不是标识字段(自动递增),但 EF 默认假定它是。因此,它不包括 INSERT 语句中的字段。【参考方案4】:

您可以尝试将 UserID 列重命名为 Id 或 UsersId,删除 [Key] 符号,遵循 EF 约定,但仅用于测试。

【讨论】:

以上是关于将 int 值添加到数据库给出错误,但字符串值有效的主要内容,如果未能解决你的问题,请参考以下文章

将较大的字符串值转换为数字 laravel。 (int) 给出错误的值

Cloud Firestore 文档添加给出错误“参数“数据”的值不是有效的 Firestore 文档。不能使用“未定义”作为 Firestore 值”

将任何值添加到最大整数值都会给出错误的计算

在 SQL 的 INT 列中输入逗号分隔的字符串

故意返回无效值或类型

将数据从 CSV 文件添加到 Pandas Dataframe 导致值错误