我有一个非常简单的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();
}
平安!
答案 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)
哦,当然,这是我第一次来这里,所以我实际上并不想污染它...你是对的我会从现在开始大力关注...网站很棒,谢谢你所有......