DategridView插入到另一个oracle表c#
本文关键字:oracle 另一个 插入 DategridView | 更新日期: 2023-09-27 18:16:36
我有一个46列的Datagridview,由日期、Int和字符串类型组成。我想插入值到另一个oracle表。
private void loopGrid()
{
foreach (DataGridViewRow datarow in this.dataGridView1.Rows)
{
writeRecord(datarow);
}
}
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;
cmd.ExecuteNonQuery();
}
我不太明白我在传递参数方面做错了什么。我很新的c#,什么是正确的方式来传递数据类型和值到另一个oracle表?
根据您正在使用的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();
}
—EDIT—
根据你的反馈和我改进的校对技巧,这是我的建议。为了更好地衡量,我在这里添加了一个事务: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();
无论如何,您还需要一些异常处理。
您可能想使用:
cmd.Parameters.Add(new OracleParameter(DbType.Date, datarow["DATE"]))
cmd.Parameters.Add(new OracleParameter(DbType.Double, datarow["Number"]));
请参阅https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.dbtype(v=vs.110).aspx