标准表达式中的数据不匹配
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") + "#"
也就是说,使用参数。
【讨论】:
以上是关于标准表达式中的数据不匹配的主要内容,如果未能解决你的问题,请参考以下文章
C# AND ACCESS - 标准表达式中的数据类型不匹配
使用 MS Access 的 C# 标准表达式中的数据类型不匹配?
在 MS Access 中保存来自 VB.Net Windows 窗体的数据时出现错误 System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配”。