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表?

DategridView插入到另一个oracle表c#

根据您正在使用的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