从Access运行时,UPDATE查询工作正常,但从C#app中引发SQL语法错误

时间:2008-12-16 13:07:25

标签: c# sql oledb sql-update

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

在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();
}

平安!

8 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

首先关闭 - 请勿在此处使用string.Format。使用参数,并向命令添加参数。现在,您对SQL注入攻击持开放态度。想想“Bobby Tables”。

重新说“我的SQL语法错误” - 你能否引用确切的错误?

答案 2 :(得分:0)

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

其次,运行这种代码会让你对SQL注入非常有用,如果有人输入嵌入了sql命令的用户名,你可能会丢失所有数据。

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

答案 3 :(得分:0)

我知道那张桌子上只有一行..只保留用户名密码等...我还添加了where语句没有变化......

好的,当涉及到参数时,你是对的,但我总是在最后的时候参数化我的东西,首先它是gots工作正常然后我参数化你知道它的凌乱和更难调试然后...这只是懒惰..

关于我的异常的细节,你看到有两个catch块,最后一个捕获它... Exception ..不是OleDBException ..它只是在UPDATE语句中说了语法错误。多数民众赞成......当我调试时,从visual studio获取sql语句,粘贴Access并且工作正常

答案 4 :(得分: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;

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

答案 5 :(得分:0)

没有我的Update方法需要3个参数,比如字符串Query,boll IsSp,params OleDBParameter [] ..而且我通常以简单的方式执行它,为sp传递false,所以它不会落入if(isSP){cmd。 CommandType = storedproc等..} ..它不这样做..还有一个空检查params集合..所以我在懒惰的时候发送null,所以它也传递了只需要查询.. :)天才吧

答案 6 :(得分:0)

对于我认识的家伙来说,这是一个小型的asp.net应用程序..这个家伙将要发送邮件消息,这只是一个屏幕,供他定义他的邮件服务器,用户和通行证,以便他可以发送电子邮件周围..只有一行,所以不需要where语句..无论如何我会把它放在“最佳实践”:)是的,访问中没有StoredProcedure的东西,但希望圣诞老人子句将LINQ带到OleDB中2009 :)所以这个查询工作正常,它确实更新了行,但只是C#一直给我这个例外......我不知道为什么真的......没有头绪

答案 7 :(得分:0)

哦,当然,这是我第一次来这里,所以我实际上并不想污染它...你是对的我会从现在开始大力关注...网站很棒,谢谢你所有......