【问题标题】:UPDATE query works fine when run from Access, but raises SQL syntax error from within C# app从 Access 运行时,UPDATE 查询工作正常,但从 C# 应用程序中引发 SQL 语法错误
【发布时间】:2008-12-16 13:07:25
【问题描述】:

我有一个非常简单的更新语句,它将更新邮件服务器设置和网络凭据信息...当我在 Access 中运行它时查询工作正常,但 C# 一直给我一个错误,指出我的 SQL 语法错误...我有一个数据访问层(dal类)和更新实例方法粘贴在下面......但问题一定是其他因为我已经以这种方式更新了很多东西,但这次它不会做......任何线索将不胜感激.提前谢谢。

更新 DAL 类中的实例方法 ..(这应该是数据访问层 :) 我只是一名管理专业毕业生 :P

public int UpdateRow(string Query, bool isSP, params OleDbParameter[] args)
{
    int affectedRows = -1;
    using (con = new OleDbConnection(connStr))
    {
        using (cmd = con.CreateCommand())
        {
            cmd.CommandText = Query;
            if (isSP)
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (args != null)
            {
                foreach (OleDbParameter prm in args)
                {
                    cmd.Parameters.Add(prm);
                }
            }

            try
            {
            con.Open();
            affectedRows = cmd.ExecuteNonQuery();
            }
            catch(OleDbException ex)
            {
            throw ex;
            }
            catch (Exception ex)
            {
            throw ex;
            }
        }
    }
    return affectedRows;
}

以及将执行更新的 ASP.NEt 代码隐藏 =

protected void Update_Click(object sender, EventArgs e) {
DAL dal = new DAL();
string upt = string.Format("UPDATE [MailConfig] SET Server='{0}', Username='{1}', Password='{2}', AddressFrom='{3}', DisplayName='{4}'",server.Text,username.Text,password.Text,replyto.Text,displayname.Text);
dal.UpdateRow(upt,false,null);
LoadData();
}

和平!

【问题讨论】:

  • 永远不要这样做! : catch(OleDbException ex) { 抛出 ex;总是在“InnerException”中用“ex”抛出新异常或使用简单的“throw;”没有“前”。以您的方式,您丢失了有关调用堆栈等的啤酒信息......
  • 能否粘贴正在更新的行的数据类型,以及每个对象的数据类型?
  • @TcKs 这是非常好的建议!如果你扔掉前任,你就有可能在链条上进一步失去原来的前任。

标签: c# sql oledb sql-update


【解决方案1】:

尝试将您的字段名称包含在 [ ] 中。过去我遇到过某些字段名称的问题,例如用户名和密码以及计数等,被识别为保留字并搞砸了 sql 给我一个错误。

【讨论】:

    【解决方案2】:

    首先 - 不要在这里使用string.Format。使用参数,并在命令中添加参数。现在,您对 SQL 注入攻击持开放态度。想想“Bobby Tables”。

    关于“声明我的 SQL 语法错误” - 您能引用确切的错误吗?

    【讨论】:

    • 哦,你不需要捕获一个异常来抛出它 - 让它自己向上冒泡。
    【解决方案3】:

    首先,您的 Update 中没有 where 子句,因此它将更新所有行,并违反导致错误的键约束(如果有的话)。

    其次,运行这种代码会使您非常容易受到 SQL 注入的影响,如果有人输入的用户名中嵌入了 sql 命令,您可能会丢失所有数据。

    您应该使用参数化查询。您在 sql 命令中使用 @paramname 而不是使用 {4} 指定参数,然后使用命令对象执行 accessCommand.parameters.AddWithValue("@paramname", value)

    【讨论】:

      【解决方案4】:

      您使用的是 StoredProcedure 的 CommandType,但您的查询不是存储过程名称,它是一个没有 where 子句的 sql 查询。

      UPDATE [MailConfig] 
      SET Server='{0}', 
          Username='{1}', 
          Password='{2}', 
          AddressFrom='{3}', 
          DisplayName='{4}'"
      

      因此您需要删除命令类型行,或将其更改为正确的命令类型 CommandType.Text,并添加 Where 子句指定要影响的行。

      我认为 Access 甚至没有存储过程,因此没有必要使用该命令类型。

      使用存储过程的命令示例如下:

      string sqlCommString = "QCApp.dbo.ColumnSeek";
      SqlCommand metaDataComm = new SqlCommand(sqlCommString, sqlConn);
      metaDataComm.CommandType = CommandType.StoredProcedure;
      

      该类型的命令字符串就是存储过程的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-09
        • 1970-01-01
        • 2018-11-02
        • 2013-05-11
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多