解决在Access中参数化SQL语句更新数据库失败的问题
Access数据库真是一个古董数据库,它的SQL语句语法跟标准的SQL server的SQL语句有许多不同之处(例如Access中是用#包括日期参数,其它数据库是用单引号包括日期参数).最近又发现了一个问题:在Access中参数化SQL更新数据库总是失败!认真检查了,没有任何语法错误,看下面代码:
后来请教别人才知道,Access数据库参数化SQL语句竟然要求非常严格的?!SQL语句里的参数顺序要跟程序代码里调用的顺序是完全一致!就如我上面举的代码例子,参数CompanyId是第一个加入了Parameter列表中,但是在它SQL语句中的位置是最末端(where CompanyId=@CompanyId),因此我们这样执行语句就不正确了,执行后的影响条数总是0.
解决方案是,将红色语句删掉,留下绿色语句,执行就正确了.
1 /// <summary> 2 /// 更新一条数据 3 /// </summary> 4 public void Update(Company model) 5 { 6 StringBuilder strSql = new StringBuilder(); 7 strSql.Append("update t_Company set "); 8 strSql.Append("CompanyName=@CompanyName,"); 9 strSql.Append("Address1=@Address1,"); 10 strSql.Append("Address2=@Address2,"); 11 strSql.Append("Address3=@Address3,"); 12 strSql.Append("Address4=@Address4,"); 13 strSql.Append("FacSimile=@FacSimile,"); 14 strSql.Append("Website=@Website,"); 15 strSql.Append("Origin=@Origin,"); 16 strSql.Append("CreateDate=@CreateDate"); 17 strSql.Append(" where CompanyId=@CompanyId "); 18 Database db = DatabaseFactory.CreateDatabase(); 19 DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString()); 20 db.AddInParameter(dbCommand, "CompanyId", DbType.Int32, model.CompanyId); 21 db.AddInParameter(dbCommand, "CompanyName", DbType.AnsiString, model.CompanyName); 22 db.AddInParameter(dbCommand, "Address1", DbType.AnsiString, model.Address1); 23 db.AddInParameter(dbCommand, "Address2", DbType.AnsiString, model.Address2); 24 db.AddInParameter(dbCommand, "Address3", DbType.AnsiString, model.Address3); 25 db.AddInParameter(dbCommand, "Address4", DbType.AnsiString, model.Address4); 26 db.AddInParameter(dbCommand, "FacSimile", DbType.AnsiString, model.FacSimile); 27 db.AddInParameter(dbCommand, "Website", DbType.AnsiString, model.Website); 28 db.AddInParameter(dbCommand, "Origin", DbType.AnsiString, model.Origin); 29 db.AddInParameter(dbCommand, "CreateDate", DbType.DateTime, model.CreateDate); 30 //db.AddInParameter(dbCommand, "CompanyId", DbType.Int32, model.CompanyId); 31 db.ExecuteNonQuery(dbCommand); 32 }
【推荐】FlashTable:表单开发界的极速跑车,让你的开发效率一路狂飙
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C#.Net筑基-泛型T & 协变逆变
· dotnet 代码调试方法
· DbContext是如何识别出实体集合的
· 一次 .NET 性能优化之旅:将 GC 压力降低 99%
· MySQL索引完全指南:让你的查询速度飞起来
· 我救了一个网站,性能提升了1500 多倍!
· .NET程序员的多语言笔记本:Polyglot Notebook
· 免费开源 .NET OpenCV 迷你运行时全平台发布
· 经验贴!万字总结网卡丢包及ping延迟等网络问题排查思路
· 用好索引的10条军规