标准表达式中的数据不匹配

Posted

技术标签:

【中文标题】标准表达式中的数据不匹配【英文标题】:Data Mismatch In Criteria Expression 【发布时间】:2021-08-27 19:36:45 【问题描述】:

我正在尝试使用 Visual Studio 上的 Winforms 从数据库和 DataGridViewer 中删除数据。我这样做的方式是选择一个单元格,并根据该单元格的位置,将删除该行。选定的行将读取两个字符串和一个日期。我已经测试了这两个字符串,它们在删除数据时工作得很好。说到日期,它似乎对我不起作用,我不断收到错误消息。错误消息将作为图像附加,代码如下。我对 C# 和 SQL 还很陌生,只是把它放在那里。

private void delete_Click(object sender, EventArgs e)
        
            foreach (DataGridViewCell theCell in daily_log.SelectedCells)
            
                if (theCell.Selected)
                
                    string eid = daily_log[0, theCell.RowIndex].Value.ToString();
                    string aid = daily_log[4, theCell.RowIndex].Value.ToString();
                    DateTime dt = Convert.ToDateTime(daily_log[5, theCell.RowIndex].Value);
                    try
                    
                        connection.Open();
                        using (OleDbCommand cmd = new OleDbCommand("DELETE FROM DailyLog WHERE EmployeeID='" + eid + "' AND ActivityID = '" + aid + "' AND Date = '" + dt.Date + "'", connection))
                        
                            cmd.ExecuteNonQuery();
                        
                        connection.Close();
                        daily_log.Rows.RemoveAt(theCell.RowIndex);
                    
                    catch (Exception ex)
                    
                        MessageBox.Show("Err: " + ex);
                    
                
            
        

这是转换错误吗?如果是这样,我将如何解决这个问题?

【问题讨论】:

当您将数据位粘合到字符串中以创建 SQL 语句时,此错误(而且更糟)很常见。始终使用 DB 参数。此外,通过数据绑定,无需像这样循环遍历行 - DGV 将与您的 DB Providers 一起使用 通过连接,Access 需要 # 分隔符而不是日期/时间类型的撇号。评论***.com/questions/8688348/… 【参考方案1】:

您可以尝试使用 OledbParameter 从 access 数据库中删除数据。

这是一个代码示例,您可以参考。

        OleDbConnection conn = new OleDbConnection("connstr");
        private void button1_Click(object sender, EventArgs e)
        
            foreach (DataGridViewCell theCell in dataGridView1.SelectedCells)
            
                if (theCell.Selected)
                
                    string id = dataGridView1[0, theCell.RowIndex].Value.ToString();
                    string aid = dataGridView1[1, theCell.RowIndex].Value.ToString();
                    DateTime dt = Convert.ToDateTime(dataGridView1[2, theCell.RowIndex].Value);
                    try
                    
                        conn.Open();
                        string sql = "delete from DailyLog where ID=@ID AND AID=@AID AND Date=@Date";
                        using (OleDbCommand cmd = new OleDbCommand(sql, conn))
                        
                            cmd.Parameters.AddWithValue("@ID", id);
                            cmd.Parameters.AddWithValue("@AID", aid);
                            cmd.Parameters.AddWithValue("@Date", dt);
                            cmd.ExecuteNonQuery();
                        
               
                        dataGridView1.Rows.RemoveAt(theCell.RowIndex);
                    
                    catch (Exception ex)
                    
                        MessageBox.Show("Err: " + ex);
                    
                
            
            conn.Close();
        

        private void Form1_Load(object sender, EventArgs e)
        
            conn.Open();
            string query = "select * from DailyLog";
            OleDbDataAdapter da = new OleDbDataAdapter(query, conn);
            OleDbCommandBuilder builder = new OleDbCommandBuilder(da);
            var ds = new DataSet();
            da.Fill(ds);
            dataGridView1.DataSource = ds.Tables[0];
            conn.Close();
        

结果:

【讨论】:

【参考方案2】:

您的 ID 可能是数字,而 Date 是保留字,因此请尝试:

"DELETE FROM DailyLog WHERE EmployeeID = " + eid + " AND ActivityID = " + aid + " AND [Date] = #" + dt.Date.ToString("yyyy'/'MM'/dd") + "#"

也就是说,使用参数。

【讨论】:

以上是关于标准表达式中的数据不匹配的主要内容,如果未能解决你的问题,请参考以下文章

标准表达式中的数据类型不匹配(vb.net,访问)

C# AND ACCESS - 标准表达式中的数据类型不匹配

使用 MS Access 的 C# 标准表达式中的数据类型不匹配?

在 MS Access 中保存来自 VB.Net Windows 窗体的数据时出现错误 System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配”。

C# Access OleDb 条件表达式中的数据类型不匹配

[转]access 标准表达式中数据类型不匹配