首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据错配。C#中要访问的UPDATE语句

数据错配。C#中要访问的UPDATE语句
EN

Stack Overflow用户
提问于 2014-01-09 14:43:12
回答 4查看 781关注 0票数 1

我正在从一个textboxes数据库中将数据加载到access中,以便进行编辑和更新。当我保存数据时,我得到Data Type Mismatch错误.

我希望像下面那样更新OCR标题,但只在选定的行上更新,这是我试图通过识别OCR标题上方文本框中的OCR号来完成的,因此我只能更新该特定行,而不是所有这些行。

代码语言:javascript
复制
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();
     }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-09 14:46:28

问题:您还没有正确地实现parameterised queries

解决方案:您需要向parameters提供值,而不是为列名提供值。

试试这个:

代码语言:javascript
复制
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();
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2014-01-09 14:45:06

不能参数化列。可以对值进行参数化。

我在您的dbCmd中没有看到任何参数。听起来不需要添加textBox7.Text作为参数。

代码语言:javascript
复制
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的顺序必须直接对应于命令文本中参数的问号占位符的位置。

票数 2
EN

Stack Overflow用户

发布于 2014-01-09 14:46:23

update语句不需要字段DeadLineDate的值,因此应该从参数集合中删除它。

当然,使用参数化查询时,需要用?占位符标记参数的位置。

代码语言:javascript
复制
    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的字段,则需要将值转换为日期时间,因为这是使用参数正确传递日期的唯一方法。

代码语言:javascript
复制
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如何不根据参数的名称识别参数,它根据占位符的累进位置插入参数的值,这样您就可以以您喜欢的任何方式命名参数,但是您应该尊重查询中需要它们的顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21023302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档