根据您使用的 Oracle 驱动程序,.Add 方法可能会出现重载,该方法接受该值作为第二个参数,或者可能存在显式执行此操作的 .AddWithValue 方法。我认为对于 ODP.net,您就像 .Add 一样正确。
无论哪种方式,这些都会从值的数据类型派生数据类型。
关于您的参数,您需要在调用参数时省略冒号: 字符。我知道在 SQL Server、Sybase、SQLite 和其他人中包含它们(在这些情况下为 @),但在 Oracle 中,您在参数声明期间将它们排除在外。有趣的是,我认为 PostgreSQL 接受任何一种方法。
因此,我认为这会起作用:
private void writeRecord(DataGridViewRow datarow)
{
string sqlqry = "insert into Table (Date,Number) values(:Date,:Number)";
OracleCommand cmd = new OracleCommand(sqlqry, conn);
cmd.Parameters.Add(new OracleParameter("Date", datarow["DATE"]))
cmd.Parameters.Add(new OracleParameter("Number", datarow["Number"]));
// cmd.CommandText = sqlqry; -- not necessary, handled in constructor
cmd.ExecuteNonQuery();
}
如果没有,可以尝试使用类型或值进行显式转换:
呸:
cmd.Parameters.Add(new OracleParameter("Date", Convert.ToDateTime(datarow["DATE"])))
cmd.Parameters.Add(new OracleParameter("Number", Convert.ToDecimal(datarow["Number"])));
更好:
cmd.Parameters.Add(new OracleParameter("DATE", OracleDbType.Date,
datarow["DATE"], ParameterDirection.Input);
cmd.Parameters.Add(new OracleParameter("Number", OracleDbType.Decimal,
datarow["Number"], ParameterDirection.Input));
如果情况变得更糟,防弹(虽然冗长)的方法是:
cmd.Parameters.Add(new OracleParameter("DATE", OracleDbType.Date));
cmd.Parameters.Add(new OracleParameter("Number", OracleDbType.Decimal));
cmd.Parameters[0].Value = datarow["DATE"];
cmd.Parameters[1].Value = datarow["Number"];
作为脚注,如果您要插入多行,则最后一种方式实际上是首选,因为您创建一次参数并修改值并多次执行插入:
cmd.Parameters.Add(new OracleParameter("DATE", OracleDbType.Date));
cmd.Parameters.Add(new OracleParameter("Number", OracleDbType.Decimal));
foreach (DataRow datarow in datarows)
{
cmd.Parameters[0].Value = datarow["DATE"];
cmd.Parameters[1].Value = datarow["Number"];
cmd.ExecuteNonQuery();
}
-- 编辑--
根据您的反馈和我改进的校对技巧,这是我的建议。我在其中添加了一笔交易以取得良好的效果:
string sqlqry = "insert into Table (Date,Number) values(:Date,:Number)";
OracleTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);
OracleCommand cmd = new OracleCommand(sqlqry, conn, trans);
cmd.Parameters.Add(new OracleParameter("DATE", OracleDbType.Date));
cmd.Parameters.Add(new OracleParameter("Number", OracleDbType.Decimal));
foreach (DataGridViewRow datarow in this.dataGridView1.Rows)
{
cmd.Parameters[0].Value = datarow.Cells["DATE"].Value;
cmd.Parameters[1].Value = datarow.Cells["Number"].Value;
cmd.ExecuteNonQuery();
}
trans.Commit();
为了它的价值,你还需要一些异常处理。