【问题标题】:execute sql update from visual c#从 Visual C# 执行 sql 更新
【发布时间】:2013-01-15 13:47:46
【问题描述】:

我有我的项目,从我的 Visual c# 访问 oracle 数据库 我在使用更新命令时遇到问题

这是我的代码

string updatetodb = "update tugas_oop ";
updatetodb += "set stok = :i_stok, ";
updatetodb += "dana_keluar = :i_dana_keluar ";
updatetodb += "where nama_barang = '" + nama_barang[i] + "' and satuan = '" + satuan[i] + "';";

cmd.CommandText = updatetodb;

OracleParameter istok = new OracleParameter();
istok.OracleDbType = OracleDbType.Int32;
istok.Value = updatestok;
istok.ParameterName = "i_stok";

OracleParameter idana_keluar = new OracleParameter();
idana_keluar.OracleDbType = OracleDbType.Int32;
idana_keluar.Value = updatedanakeluar;
idana_keluar.ParameterName = "i_dana_keluar";

cmd.Parameters.Add(istok);
cmd.Parameters.Add(idana_keluar);
cmd.ExecuteNonQuery();

我收到错误消息 ora-00911 你能告诉我,我在哪里做错了吗?

【问题讨论】:

  • 为什么只使用部分参数? nama_barang[i]satuan[i] 也应该被参数化。
  • 你听说过存储过程吗?阅读那些
  • upatestok 和 updatedanakeluar 的值是多少?这是您的确切代码吗?除非您将 commnand 的 BindByName 属性显式设置为 true,否则参数的名称是不相关的,它们受位置约束。有关更多详细信息,请参阅this question

标签: c# sql


【解决方案1】:

替换为

istok.ParameterName = ":i_stok";

idana_keluar.ParameterName = ":i_dana_keluar";

我建议您使用string.Format(确保您对报价没有问题)

string.Format("update tugas_oop set stok = :i_stok, dana_keluar = :i_dana_keluar where nama_barang = {0} and satuan = {1}",nama_barang[i],satuan[i]);

注意:对我来说,我更喜欢使用存储过程,以便在调用之前验证您的查询

【讨论】:

  • 您为什么建议使用string.Format 而不是其他参数?参数不仅可以防止SQL Injection,还可以消除转换错误或数据截断的可能性,并将代码与数据分开以便于阅读。
  • 我的意思是你为什么不建议对 nama_barang 以及 i_stok 和 i_dana_keluar 使用参数。即创建 SQLCommandupdate tugas_oop set stok = :i_stok, dana_keluar = :i_dana_keluar where nama_barang = :i_nama_barang and satuan = :i_satuan,然后使用command.Parameters.Add("i_nama_barang", nama_barang[i]);向命令添加参数
  • 好吧好吧我明白你的评论 GarethD,谢谢你的精确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
相关资源
最近更新 更多