c#winforms应用程序更新ms access中的所有记录

c#winforms应用程序更新ms access中的所有记录,c#,.net,winforms,ms-access-2010,C#,.net,Winforms,Ms Access 2010,当我更新任何记录时,整个表都被更新为相同的记录(行),我正在尝试下面的代码。我也尝试过连接,但有人告诉我sql注入 con.Open(); try { OleDbCommand cmd = new OleDbCommand(); cmd.Connection = con; cmd.CommandType = CommandType.Text; cmd.CommandText = @"UPDATE emptable

当我更新任何记录时,整个表都被更新为相同的记录(行),我正在尝试下面的代码。我也尝试过连接,但有人告诉我sql注入

con.Open();
try
{
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = @"UPDATE emptable 
                        SET EmpName=@EmpName, Age=@Age ,Mobile=@Mobile,  
                            Designation=@Designation ,Salary=@Salary ,  
                            joiningDate=@joiningDate ,Address=@Address,  
                            AccountNo=@AccountNo,  
                            AccountHoldersName=@AccountHoldersName,  
                            BankName=@BankName,IFSC=@IFSC, 
                            EmpCode=@EmpCode,UINPANNO=@UINPANNO,
                            Whatsapp=@Whatsapp,FathersName=@FathersName,
                            MaritalStatus=@MaritalStatus,Email=@Email 
                     WHERE Mobile= Mobile";
    cmd.Parameters.AddWithValue("@EmpName", EmpNametxtbx.Text);
    cmd.Parameters.AddWithValue("@Age", Agetxtbx.Text);
    cmd.Parameters.AddWithValue("@Mobile", Mobiletxtbx.Text);
    cmd.Parameters.AddWithValue("@Designation", Designationcmbbx.Text);
    cmd.Parameters.AddWithValue("@Salary", Salarytxtbx.Text);
    cmd.Parameters.AddWithValue("@JoiningDate", dTP1.Text);
    cmd.Parameters.AddWithValue("@Address", Addresstxtbx.Text);
    cmd.Parameters.AddWithValue("@AccountNo", Accounttxtbx.Text);  
    cmd.Parameters.AddWithValue("@AccountHoldersName", Holderstxtbx.Text);
    cmd.Parameters.AddWithValue("@BankName", Banktxtbx.Text);
    cmd.Parameters.AddWithValue("@IFSC", Ifsctxtbx.Text);
    cmd.Parameters.AddWithValue("@EmpCode", EmpCodetxtbx.Text);
    cmd.Parameters.AddWithValue("@UINPANNO", Uptxtbx.Text);
    cmd.Parameters.AddWithValue("@Whatsapp", Whatsapptxtbx.Text);
    cmd.Parameters.AddWithValue("@FathersName", Fatherstxtbx.Text);
    cmd.Parameters.AddWithValue("@MaritalStatus", MStatuscmbbx.Text);
    cmd.Parameters.AddWithValue("@Email", Emailtxtbx.Text);

    cmd.ExecuteNonQuery();
    MessageBox.Show("record update");

    //refresh or update table 
    OleDbCommand cmd1 = new OleDbCommand();
    cmd1.Connection = con;
    string query = "select * from emptable";
    cmd1.CommandText = query;
    OleDbDataAdapter da = new OleDbDataAdapter(cmd1);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}
catch (Exception ex)
{
    MessageBox.Show("error   " + ex);
}

//  Clear();
con.Close();

问题只是这里的一个输入错误
其中Mobile=Mobile

它应该是
,其中Mobile=@Mobile
,因此
Mobile
作为参数传递,而不是作为表值传递。在这种情况下,infact条件始终为真,因此每个记录都会得到更新

关于连接:永远不要使用连接来生成查询
不仅你把你的代码弄乱了,而且如果出了什么问题,你还准备去调试,这让你头疼不已,就像有人告诉你的那样,你也在冒着SQL注入的风险

WHERE Mobile= @Mobile

关于Sql注入,您可以使用应用程序|三轮胎体系结构|通过数据访问层连接并使用存储过程,然后加密您的业务层或控制器。。。但是MS Access不支持存储过程您可以使用MS SQL Server,其中Mobile=Mobile

应替换为
WHERE Mobile=@Mobile
不知道您要做什么,但当前问题是由“排版错误”-
WHERE Mobile=Mobile引起的";
始终为true,因此所有记录都符合该条件。在修复WHERE键入错误后,这里还会出现逻辑错误。使用Mobile值两次,一次更新字段,一次在WHERE子句中搜索字段,现在如果两个值不同,则需要一个单独的参数。(新旧)在更改条件
其中Mobile=@Mobile之后,
更新了该列的所有记录。就像所有的员工一样,我更新了他们的名字。这意味着除了对单行进行更新外,它对整个列都有效……谢谢你给我宝贵的时间,但我仍然有麻烦,请帮助我,@Chetan Ranpariya,@Alexei Levenkov,@steveyou为添加的WHERE Mobile=@Mobile?添加了另一个参数吗?。在OleDb中,参数是位置参数,它们的名称(@xxx)无法识别,因此如果您有18个参数占位符,则需要按照占位符在sql文本中出现的确切顺序添加18个参数。更改条件Where Mobile=@Mobile后,它会更新该列的所有记录。就像所有员工的名字在我更新名字的时候变得一样。这意味着它可以在整列上工作,同时对单行进行更新…谢谢你给我宝贵的时间,但我仍然有麻烦,请帮助我