0

我有一个非常简单的更新语句,它将更新邮件服务器设置和网络凭据信息......当我在 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();
}

和平!

4

4 回答 4

3

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

于 2008-12-16T13:32:51.887 回答
0

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

重新“声明我的 SQL 语法错误” - 你能引用确切的错误吗?

于 2008-12-16T13:13:49.820 回答
0

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

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

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

于 2008-12-16T13:14:35.373 回答
0

您正在使用 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;

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

于 2008-12-16T13:20:38.307 回答