为什么这段SQL没有效果?

qaz的烧杯 2011-10-06 12:49:33
 
public void Vote(int number,int id)
{
//OleDbCommand comr = new OleDbCommand("SELECT @vl FROM [topics WHERE [ID]=@id", con);
//comr.Parameters.Add("@vl", "vl" + number);
//comr.Parameters.Add("@id", id);
OleDbCommand com = new OleDbCommand("UPDATE [topics] SET [@vl]=[@vl]+1 WHERE [ID]=@id",con);
com.Parameters.Add("@vl", "vl" + number.ToString());
OleDbParameter par = new OleDbParameter("@id", OleDbType.Integer);
par.Value = id;
com.Parameters.Add(par);
con.Open();
com.ExecuteNonQuery();
com.Dispose();
con.Close();
}

调用时:

Vote(int.Parse(par.Substring(5,1)),int.Parse(Request.QueryString["id"]));

使用Access2010数据库。
...全文
81 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Allison_220 2011-10-06
  • 打赏
  • 举报
回复
过来学下一下。
chen576161825 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sp1234 的回复:]
你可以回忆一下从哪里见过这种写法:

变量标识字段名
变量放在中括号里边
[/Quote]

每次只说错,不说怎么解决,行不行啊你
要不就别说,要不就把解决方案告诉人家
  • 打赏
  • 举报
回复
你可以回忆一下从哪里见过这种写法:

变量标识字段名
变量放在中括号里边
  • 打赏
  • 举报
回复
别白费力气。根本就不支持

SET [@vl]=[@vl]+1

这种写法。
qaz的烧杯 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ynsky 的回复:]

调试下就清楚了!
[/Quote]怎么调试?我设置断点之后还是什么也不清楚。
YnSky 2011-10-06
  • 打赏
  • 举报
回复
调试下就清楚了!
haihuan23 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qazwsx6481mym 的回复:]

引用 4 楼 haihuan23 的回复:

SQL code

UPDATE [topics] SET [vl字段名]=[@vl]+1 WHERE [ID]=@id
不是跟我的一样吗。。。
[/Quote]

无语了,你把添加了 参数的 SQL语句 放到 查询分析器里跑一次看看是什么样的你就知道了。
todayclock 2011-10-06
  • 打赏
  • 举报
回复
注入式攻击,什么年代了。
你手动调个方法处理下。参数化只是一种。
qaz的烧杯 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 todayclock 的回复:]

string column="vl" + number.ToString();
string strSql=String.Format("UPDATE [topics] SET [{0}]=[{1}]+1 WHERE [ID]=@id",column,column);
OleDbCommand com = new OleDbCommand(strSql,con);
[/Quote]那万一出现注入式攻击呢?
qaz的烧杯 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 haihuan23 的回复:]

SQL code

UPDATE [topics] SET [vl字段名]=[@vl]+1 WHERE [ID]=@id
[/Quote]不是跟我的一样吗。。。
todayclock 2011-10-06
  • 打赏
  • 举报
回复
string column="vl" + number.ToString();
string strSql=String.Format("UPDATE [topics] SET [{0}]=[{1}]+1 WHERE [ID]=@id",column,column);
OleDbCommand com = new OleDbCommand(strSql,con);
叶子 2011-10-06
  • 打赏
  • 举报
回复
断点调试一下,看看参数和后面执行的sql是什么样子的。
haihuan23 2011-10-06
  • 打赏
  • 举报
回复

UPDATE [topics] SET [vl字段名]=[@vl]+1 WHERE [ID]=@id
qaz的烧杯 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 keenweiwei 的回复:]

OleDbCommand com = new OleDbCommand("UPDATE [topics] SET @vl=@vl+1 WHERE [ID]=@id",con);
[/Quote]这样一改就出了异常:

用户代码未处理 System.Data.OleDb.OleDbException
Message="标准表达式中数据类型不匹配。"
Source="Microsoft JET Database Engine"
ErrorCode=-2147217913
StackTrace:
在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
在 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
在 CQApplication.classes.SurveyOperation.Vote(Int32 number, Int32 id) 位置 D:\CQApplication\CQApplication\CQApplication\classes\SurveyOperation.cs:行号 32
在 CQApplication.SurveyRead.RaiseCallbackEvent(String par) 位置 D:\CQApplication\CQApplication\CQApplication\SurveyRead.aspx.cs:行号 152
在 System.Web.UI.Page.PrepareCallback(String callbackControlID)
InnerException:
ijwsoft 2011-10-06
  • 打赏
  • 举报
回复
OleDbCommand com = new OleDbCommand("UPDATE [topics] SET @vl=@vl+1 WHERE [ID]=@id",con);
haihuan23 2011-10-06
  • 打赏
  • 举报
回复
SET [@vl]=[@vl]+1

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧