我正在从一个textboxes数据库中将数据加载到access中,以便进行编辑和更新。当我保存数据时,我得到Data Type Mismatch错误.
我希望像下面那样更新OCR标题,但只在选定的行上更新,这是我试图通过识别OCR标题上方文本框中的OCR号来完成的,因此我只能更新该特定行,而不是所有这些行。
string strSql = "UPDATE Responses SET [OCR Title] = '" + textBox6.Text + "' where OCR = '" + textBox5.Text + "'";
using (OleDbConnection newConn = new OleDbConnection(strProvider))
{
using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn))
{
dbCmd.CommandType = CommandType.Text;
dbCmd.Parameters.AddWithValue("OCR", textBox5.Text);
dbCmd.Parameters.AddWithValue("DeadlineDate", textBox7.Text);
dbCmd.Parameters.AddWithValue("[OCR Title]", textBox6.Text);
newConn.Open();
dbCmd.ExecuteNonQuery();
}
}发布于 2014-01-09 14:46:28
问题:您还没有正确地实现parameterised queries。
解决方案:您需要向parameters提供值,而不是为列名提供值。
试试这个:
string strSql = "UPDATE Responses SET [OCR Title] = @OCRTitle where OCR = @OCR";
using (OleDbConnection newConn = new OleDbConnection(strProvider))
{
using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn))
{
dbCmd.CommandType = CommandType.Text;
dbCmd.Parameters.AddWithValue("@OCRTitle", textBox6.Text);
dbCmd.Parameters.AddWithValue("@OCR", textBox5.Text);
newConn.Open();
dbCmd.ExecuteNonQuery();
}
}发布于 2014-01-09 14:45:06
不能参数化列。可以对值进行参数化。
我在您的dbCmd中没有看到任何参数。听起来不需要添加textBox7.Text作为参数。
string strSql = "UPDATE Responses SET [OCR Title] = ?
where OCR = ?";
using (OleDbConnection newConn = new OleDbConnection(strProvider))
{
using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn))
{
dbCmd.CommandType = CommandType.Text;
dbCmd.Parameters.AddWithValue("@OCRTitle", textBox6.Text);
dbCmd.Parameters.AddWithValue("@OCR", textBox5.Text);
newConn.Open();
dbCmd.ExecuteNonQuery();
}
}请注意,在OleDb中,参数顺序很重要。
来自OleDbCommand.Parameters
OLE DB .NET提供程序不支持将参数传递给OleDbCommand在将CommandType设置为文本时调用的参数或存储过程的命名参数。在这种情况下,问号(?)必须使用占位符。例如: 从客户中选择* CustomerID =? 因此,将OleDbParameter对象添加到OleDbParameterCollection的顺序必须直接对应于命令文本中参数的问号占位符的位置。
发布于 2014-01-09 14:46:23
update语句不需要字段DeadLineDate的值,因此应该从参数集合中删除它。
当然,使用参数化查询时,需要用?占位符标记参数的位置。
string strSql = "UPDATE Responses SET [OCR Title] = ? where OCR = ?";
using (OleDbConnection newConn = new OleDbConnection(strProvider))
{
using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn))
{
dbCmd.CommandType = CommandType.Text;
dbCmd.Parameters.AddWithValue("@p1", textBox5.Text);
dbCmd.Parameters.AddWithValue("@p2", textBox6.Text);
newConn.Open();
dbCmd.ExecuteNonQuery();
}
}相反,如果还必须更新DeadlineDate的字段,则需要将值转换为日期时间,因为这是使用参数正确传递日期的唯一方法。
string strSql = "UPDATE Responses SET [OCR Title] = ?, DeadlineDate = ? " +
"where OCR = ?";
using (OleDbConnection newConn = new OleDbConnection(strProvider))
{
using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn))
{
dbCmd.CommandType = CommandType.Text;
dbCmd.Parameters.AddWithValue("@p1", textBox5.Text);
dbCmd.Parameters.AddWithValue("@p2", Convert.ToDateTime(textBox7.Text));
dbCmd.Parameters.AddWithValue("@p3", textBox6.Text);
newConn.Open();
dbCmd.ExecuteNonQuery();
}
}还请注意OleDb如何不根据参数的名称识别参数,它根据占位符的累进位置插入参数的值,这样您就可以以您喜欢的任何方式命名参数,但是您应该尊重查询中需要它们的顺序。
https://stackoverflow.com/questions/21023302
复制相似问题