winforms Access数据库未更新或未读取

35g0bw71  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(94)

我是一个初学者在C#,刚刚学会了它的学校项目,现在我正试图工作的登录应用程序项目的学校,但似乎无法让我的数据库访问更新,或获得阅读。
每当我更新密码时,它显示密码已成功更新,但它不会反映在我的数据库中。
所有的数据库连接字符串和表引用都是正确的,我三次检查。有人能帮忙吗?
顺便说一句,是的,我从我的项目解决方案文件目录中的 BIN 文件夹打开我的访问数据库,在某个地方读到它有帮助。但现在这样反而有帮助
更新按钮单击事件的代码

con.Open();
if (txtNewPassword.Text == txtConfirmPassword.Text)
{
   OleDbCommand cmd = new OleDbCommand("update LoginDeets set [Password] = '" + txtNewPassword.Text + "' where Username = '" + txtUsername.Text + "'", con);
   cmd.ExecuteNonQuery();
   lblErrMsg.Text = "Data Updated Successfully";
   con.Close();
}

字符串

m528fe3b

m528fe3b1#

请注意评论中的建议,而不是使用密码,考虑使用诸如阅读,添加和更新人员表之类的数据,这些数据不像密码那样敏感。

重要:不要简单地复制和粘贴所提供的代码并简单地使用它,而是确保您理解代码,然后适应您正在做的事情,而不涉及密码。

插入新记录时,使用从ExecuteNonQuery返回的值,该值返回一个int。因此,对于插入一行,值应该为1。如果是1,那么我们也可以得到新的主键。给定一个主键为Id的表和两个字符串列FirstName和LastName,我们可以编写以下代码。

连接变量

public static string ConnectionString =
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Database1.accdb";

字符串
以下所有代码均使用.NET Core 7编写

新增方式

public static (bool success, int) InsertRow(string firstName, string lastName)
{

    using OleDbConnection cn = new() { ConnectionString = ConnectionString };
    using OleDbCommand cmd = new() { Connection = cn };

    cmd.Parameters.Add(new OleDbParameter
    {
        ParameterName = "@FirstName",
        DbType = DbType.String
    }).Value = firstName;

    cmd.Parameters.Add(new OleDbParameter
    {
        ParameterName = "@LastName",
        DbType = DbType.String
    }).Value = lastName;
        
    cmd.CommandText = 
        @"INSERT INTO Person (FirstName,LastName) 
          VALUES (@FirstName, @LastName)";

    cn.Open();

    // insert new row
    int affected = cmd.ExecuteNonQuery();
    // validate insert worked
    if (affected == 1)
    {
        // insert successful, get new primary key
        cmd.CommandText = "SELECT @@Identity";
        cmd.Parameters.Clear();
        var reader = cmd.ExecuteReader();
        reader.Read();
        return (true, reader.GetInt32(0));
    }
    else
    {
        // insert failed
        return (false, -1);
    }
}

更新行

然后,对于更新,我们检查ExecuteNonQuery的值,在更新一条记录的情况下,该值将为1。

public static bool UpdateRow(int identifier, string firstName, string lastName)
{

    using OleDbConnection cn = new() { ConnectionString = ConnectionString };
    using OleDbCommand cmd = new() { Connection = cn };

    cmd.Parameters.Add(new OleDbParameter
    {
        ParameterName = "@FirstName",
        DbType = DbType.String
    }).Value = firstName;

    cmd.Parameters.Add(new OleDbParameter
    {
        ParameterName = "@LastName",
        DbType = DbType.String
    }).Value = lastName;

    cmd.Parameters.Add(new OleDbParameter
    {
        ParameterName = "@Id",
        DbType = DbType.Int16
    }).Value = identifier;

    cmd.CommandText =
        @"UPDATE Person 
          SET FirstName = @FirstName, LastName = @LastName 
          WHERE id = @Id";

    cn.Open();

    return cmd.ExecuteNonQuery() == 1;
}


读取数据

public static DataTable GetAll()
{
    DataTable table = new DataTable();
    using OleDbConnection cn = new() { ConnectionString = ConnectionString };
    using OleDbCommand cmd = new() { Connection = cn };
    cmd.CommandText = "SELECT Id, FirstName, LastName FROM Person";
    cn.Open();
    table.Load(cmd.ExecuteReader());
    return table;
}


为了确保您正在查看正确的数据库,对于.NET Core项目,应该有一个数据库的项组,如下所示。

<ItemGroup>
  <Content Include="Database1.accdb">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>


这是因为将属性Copy to output Directory设置为Copy if Newer,如果不这样做,代码仍然可以工作,但在再次运行项目时会被覆盖。
Visual Studio:Copying files to Debug or Release folder

表单编码

上面的所有代码都写在一个名为DataOperations.cs的类文件中

using System.Data;

namespace YourNamespaceGoesHere;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void AddButton_Click(object sender, EventArgs e)
    {
        var (success, identifier) = DataOperations.InsertRow("Frank", "Smith");
        if (success)
        {
            // identifier has the new primary key
        }
        else
        {
            // failed
        }
    }

    private void UpdateButton_Click(object sender, EventArgs e)
    {
        var result = DataOperations.UpdateRow(3, "Karen", "Smith");
        if (result)
        {
            // updated
        }
        else
        {
            // failed
        }
    }

    private void ReadButton_Click(object sender, EventArgs e)
    {
        DataTable table = DataOperations.GetAll();
    }
}

相关问题