【问题标题】:c# - update ms-access database records with same id independentlyc# - 独立更新具有相同 ID 的 ms-access 数据库记录
【发布时间】:2015-12-02 16:47:21
【问题描述】:

我有一些学生的关系 ms-access 数据库。 (数据库已经填充了一些数据) 我的数据库中有两个表: 1. tblStuInfo 用于学生的一般信息。 2. tblStuEducation 用于管理他们每年的成绩和兴趣。

名为“StuID”的列是 tblStuInfo 中的主键和外键 在 tblStuEducation 中。

My database structure looks like this & example data looks like this

在我的表单加载事件中,为 tblStuEducation 表中的每条记录自动创建动态文本框,并且它们被适当地填充没有问题。

我的问题是当我通过 winform 编辑一些信息(这里假设只是 EduYear)并单击保存时,所有记录将获得相同的值(最后一个文本框)

这是我的保存按钮代码:

connection.Open();

OleDbCommand updateStuEducation = new OleDbCommand();
updateStuEducation.Connection = connection;
readStuEducation.CommandText = "select * from tblStuEducation where stuID = 1000";

//textBoxNamesArray use LINQ to save all values from textboxes with txtEduYear in their name
    string[] textBoxNamesArray = tabpEdu.Controls.OfType<TextBox>().Where(a => a.Name.Contains("txtEduYear")).Select(a => a.Text).ToArray();
    Int32 i = 0;

    foreach (string value in textBoxNamesArray)
    {
        readStuEducation.CommandText = "update tblStuEducation set EduYear = '" + value[i] + "'";
        readStuEducation.ExecuteNonQuery();
        i++;
    }

    connection.Close();

我需要以下内容:

if i = 0 => value[0] Save in Row[0] of tblStuEducation where stuID = 1000. 
if i = 1 => value[1] Save in Row[1] of tblStuEducation where stuID = 1000. 
if i = 2 => value[2] Save in Row[2] of tblStuEducation where stuID = 1000.

等等……

【问题讨论】:

    标签: c# database winforms datatable


    【解决方案1】:

    我会做出三个改变;

    1) 你需要一个 WHERE 子句——'update tblStuEducation set EduYear = x' 将更新表中每条记录的 EduYear。

    2) 这里有一个 SQL 注入漏洞;连接字符串以创建 CommandText 是不可接受的。您需要拨打readStuEducation.Parameters.Add() 或类似的电话。 (阅读this about parameters for OleDb)

    3) 当您访问value[i] 时,看起来可能有些混乱;因为value 已经包含相应文本框中的值。 value[i] 将返回该字符串中的单个字符。

    所以你应该得到类似的东西

    readStuEducation.CommandText = "update tblStuEducation set Grade = ? where stuID = ? and EduYear = ?";
    readStuEducation.AddParameter(value); // value to set
    readStuEducation.AddParameter(1000); // student ID
    readStuEducation.AddParameter(eduYear); // student ID
    readStuEducation.ExecuteNonQuery();
    

    【讨论】:

    • 谢谢史蒂夫。但它仍然使用最新的文本框值更新 stuID = 1000 的记录中的所有 EduYear 列。我需要用它的独立年份值更新每一行。
    • 那么您可能需要在 WHERE 子句中添加另一个条件——我已经添加了一个作为示例;这将为特定学生设置特定年份的成绩。
    • 这正是我的问题。除了 stuID,所有其他列都可以有不同的值,因此条件可能会有所不同。我正在寻找一种解决方案来浏览更新查询中的每一行。就像我们在循环中使用 DataReader 时一样
    • 亲爱的史蒂夫。我可以通过在我的第二个表中添加一个新列(计数器)并按照您的建议在 WHERE 子句中为其添加另一个条件来解决它。只想说声谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多