0

我正在尝试使用 C# 语言和 Visual Studio 2010 和 SQL Server 2005 数据开发应用程序 ASP MVC 3。我想在我的数据库中记录,但我不能,因为我输入的参数 ,,,, 被视为 NULL(当我将光标放在 Insert (matricule, ...) 语句中的参数上时,编辑告诉我他们是NULL)

这是应用程序显示的错误:

The INSERT statement is in conflict with the FOREIGN KEY constraint "FK_Users_Account". The conflict occurred in database "Range" table "dbo.Account", column 'Type_User'.

该语句已终止。

PS当我更改此声明时:

SqlCommand cmd = new SqlCommand("Insert Into Users(Matricule, Nom_User,PassWord, Type_User )Values('"+Matricule+"','"+Nom_User+"','"+passWord+"','"+Type_User+"')", cn);

这样 :

SqlCommand cmd = new SqlCommand("Insert Into Users(Matricule, Nom_User,PassWord, Type_User )Values('user2','anouar','anouar','Admin')", cn);

它是手动工作的,这意味着没有将值放入表单中


感谢您的回答,我改变了这样的代码,但总是同样的问题:

public int Insert(string Matricule, string Nom_User, string passWord, string Type_User, string ID_UF)
    {
        SqlConnection cn = new SqlConnection(@"Data Source = SWEET-DE396641E \ SQLEXPRESS; User Id = adminUser; Password = adminUser; Initial Catalog = Gamme");
        cn.Open();


        string sqlquery = ("Insert Into Users(Matricule, Nom_User,PassWord, Type_User, ID_UF )Values(@Matricule, @Nom_User, @passWord, @Type_User, @ID_UF)");
        SqlCommand cmd = new SqlCommand(sqlquery, cn);


        cmd.Parameters.AddWithValue("@Matricule", this.Matricule);
        cmd.Parameters.AddWithValue("@Nom_User", this.Nom_User);
        cmd.Parameters.AddWithValue("@passWord", this.passWord);
        cmd.Parameters.AddWithValue("@Type_User", this.Type_User);
        cmd.Parameters.AddWithValue("@ID_UF", this.ID_UF);
        return cmd.ExecuteNonQuery();
    }

这是错误:参数化查询'(@ Matricule nvarchar(4000),@ user_name nvarchar(4000),@ passWord nv'期望参数@俱乐部编号尚未指定。

4

2 回答 2

0

您可能会混淆数据库空值和 c# 空值。尝试为任何空值发送 DBNull.Value。

另外,我建议您使用参数化查询。它们使您的代码更易于阅读并避免严重的安全问题(即使这只是家庭作业,最好练习安全代码)。

像这样的东西(未经测试,但概念就在这里)......

SqlCommand cmd = new SqlCommand("Insert Into Users(Matricule, Nom_User,PassWord, Type_User )Values(@Matricule, @Nom_User, @passWord, @Type_User)", cn);
cmd.Parameters.Add("@Matricule", Matricule ?? DBNull.Value);
cmd.Parameters.Add("@Nom_User", Nom_User?? DBNull.Value);
cmd.Parameters.Add("@PassWord", PassWord?? DBNull.Value);
cmd.Parameters.Add("@Type_User ", Type_User ?? DBNull.Value);
于 2013-04-29T00:20:35.213 回答
0

首先,正如 Nomad101 建议的那样,您需要确保您的帖子字段正在被填充,并且您的控制器方法上具有 [HttpPost] 属性,并调试/单步执行您的代码以验证值是否已填充。

其次,您创建查询的方式使您容易受到黑客攻击。永远不要将您的参数连接到您的查询中。我注意到在我输入此内容时,Brian 发布了正确方法的描述。此外,您还想了解我在这里提到的数据访问对象设计模式。

于 2013-04-29T00:24:30.393 回答