【问题标题】:Cannot update Access Database DataGridView无法更新 Access 数据库 DataGridView
【发布时间】:2021-10-01 23:15:37
【问题描述】:

我正在尝试以某种方式再次更新检索来自 Access 数据库 (Random piece of data with column names) 的数据

我正在使用Microsoft.ACE.OLEDB.12.0

我创建了一个查询,它应该返回列的值介于两个日期之间的记录:

SQL 示例:

SELECT Arkusz1.ID, Arkusz1.Adres, Arkusz1.Umówione, Arkusz1.Data_umówienia, Arkusz1.Zakończone, Arkusz1.[Spisano?], Arkusz1.Notatki  
FROM Arkusz1 
WHERE( 
     ((Arkusz1.Umówione) = Yes) // or 1 or <> 0
 AND ((Arkusz1.Zakończone) = No)  // or 0 doesen't provide right answer
 AND ((Arkusz1.Data_umówienia) BETWEEN 24/07/2021 AND 26/07/2021) ) 
 ORDER BY Arkusz1.Data_umówienia;

我的代码:

void fillGrid()
{
    string teraz = DateTime.Today.AddDays(-1).ToShortDateString().Replace('.', '/');
    string jutro = DateTime.Today.AddDays(1).ToShortDateString().Replace('.', '/');
    // AddDays +-1 because of my data issue, that's not important

    string dzisiejsze = "SELECT Arkusz1.ID, Arkusz1.Adres, Arkusz1.Umówione, Arkusz1.Data_umówienia," 
        + " Arkusz1.Zakończone, Arkusz1.[Spisano?], Arkusz1.Notatki  FROM Arkusz1" 
        + " WHERE( ((Arkusz1.Umówione) = Yes) AND ((Arkusz1.Zakończone) = No) AND " 
        + "((Arkusz1.Data_umówienia) BETWEEN "
        + teraz + " AND " + jutro + ") )" 
        + " ORDER BY Arkusz1.Data_umówienia;";
        //selecting almost every column from my only sheet (Arkusz1), 
        //if Umówione (appointment is arranged) has True value AND issue is not ended (Zakończone) 
        //AND appointment date is between yesterday and tomorrow 
        //(as I said, that's all because my stupid ideas in creating DB)

    connection.Open();

    OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dzisiejsze, connection);
    DataTable dt = new DataTable();
    dataAdapter.Fill(dt);
    TodaysPlan_dataGridView.DataSource = dt;
    TodaysPlan_dataGridView.Refresh();

    connection.Close();
}

我什至添加了一个特殊的按钮来更新整个网格(首先它应该在第二个表单关闭后更新):

private void refreshGrid_Click(object sender, EventArgs e)
{
    Application.DoEvents(); // because I saw something on stack, didn't work
    fillGrid(); //start filling again, didn't work too
    TodaysPlan_dataGridView.Refresh(); // same, didn't work
}

我没有收到任何错误,执行(即使在调试模式下)只是通过 refreshGrid_Click 中的代码。

Edit: Tried to execute that SQL code for random data, didn't work too Ofc 这不是我问题中最重要的部分,但我可以另外问:)

我还将提供 从第二种形式保存按钮的代码,但在我看来,它不会真正有帮助:

private void save_button_Click(object sender, EventArgs e)
{
    if ((Tick_label.Visible == true) && (IDInfo_label.Text == "All good!") && (street_textBox.TextLength > 0))
    {
        connection.Open();
        string cmd_string = "INSERT INTO Arkusz1 (ID, Adres, Przydzielenie) VALUES ('" + ID_maskedTextBox.Text + "', '" + street_textBox.Text + "','" + startDate_dateTimePicker.Value + "')";
        OleDbCommand command = new OleDbCommand(cmd_string, connection);
        command.ExecuteNonQuery();
        connection.Close();

        this.DialogResult = DialogResult.OK;
        this.Close();
    }
    else
    {
        MessageBox.Show("error");
    }
}

这是我关于 Stack 的第一个问题,欢迎任何建议和建设性批评!

顺便说一句,我正在使用this YT 教程,希望它可以帮助某人:)

【问题讨论】:

  • 两点:第一,你没有告诉我们你得到什么样的错误。其次,不要连接字符串来构建 sql 查询。使用参数
  • 第三:是/否不是布尔字段的有效值。使用 = 0 或 0
  • 对,给我一点时间来编辑问题
  • @Steve One: 我没有任何错误,即使在调试时 refreshGrid_Click() 它只是通过,就像执行已经发生(但 ofc 没有任何改变)二:我曾经连接字符串,因为我的主要语言是 Python,它对我来说看起来不错,但正如你所说 - 这不是最优雅的方式:/ 三: 是/ Access 中无效,C# 查询不提供正确答案,但不返回错误,所以我猜这两种方式都适用于 SQL
  • Access 中的布尔字段接受 OleDbType.Boolean 类型的参数,因此您的参数设置为 bool (true/false)。日期字段接受 BETWEEN @date1 AND @date2。参数类型是OleDbType.Date——如果你不使用参数来传递你的值,你有一个大问题。如果您的日期字段实际上是字符串,那么您有一个大问题。如果是这种情况,请先解决这些问题。当您添加具有正确数据类型的命令参数时,透视图会发生变化。很多。

标签: c# sql winforms datagridview ms-access-2016


【解决方案1】:

好的,@Steve 和@Jimi 提供的信息真的很有帮助,首先我使用String.Format() 更改了字符串格式并解决了 SQL 问题 - 这是 (#date#) 格式:

DateTime tmp_teraz = DateTime.Today.AddDays(-1);
string teraz = String.Format("{0}/{1}/{2}", tmp_teraz.Month.ToString(), 
tmp_teraz.Day.ToString(), tmp_teraz.Year.ToString());

DateTime tmp_jutro = DateTime.Today.AddDays(1);
string jutro = String.Format("{0}/{1}/{2}", tmp_jutro.Month.ToString(), tmp_jutro.Day.ToString(), tmp_jutro.Year.ToString());

string dzisiejsze = String.Format("SELECT Arkusz1.ID, Arkusz1.Adres, Arkusz1.Umówione, Arkusz1.Data_umówienia, Arkusz1.Zakończone, Arkusz1.[Spisano?], Arkusz1.Notatki  FROM Arkusz1 WHERE( ((Arkusz1.Umówione) = true) AND ((Arkusz1.Zakończone) = false) AND ((Arkusz1.Data_umówienia) " +
            "BETWEEN (#{0}#) AND (#{1}#)) ) ORDER BY Arkusz1.Data_umówienia;", teraz, jutro);

最后,网格看起来像this

使用 dataGrid 刷新或插入数据不起作用,但随着时间的推移,我会开发这个功能。

感谢您的帮助,祝大家有个愉快的一天!

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多