使用MVC将多行从Excel插入到ORACLE

时间:2019-05-07 08:23:57

标签: c# asp.net-mvc

我想将数据从excel插入到ORACLE,但是它不起作用。谁能帮助我?谢谢大家! 这是我的控制器代码

DataTable dt = ds.Tables [0];

            OracleConnection oraclecon = (OracleConnection)db.Database.Connection;

            // create command and set properties  
            OracleCommand cmd = oraclecon.CreateCommand() as OracleCommand;

            oraclecon.Open();

            string[] MA_TB = new string[dt.Rows.Count];
            string[] GHICHU = new string[dt.Rows.Count];

            for (int j = 0; j < dt.Rows.Count; j++)
            {
               MA_TB[j] = Convert.ToString(dt.Rows[j]["MA_TB"]);
                GHICHU[j] = Convert.ToString(dt.Rows[j]["GHICHU"]);
            }

            OracleParameter mA_TB = new OracleParameter();
            mA_TB.OracleDbType = OracleDbType.Varchar2;
            mA_TB.Value = MA_TB;

            OracleParameter gHICHU = new OracleParameter();
            gHICHU.OracleDbType = OracleDbType.Varchar2;
            gHICHU.Value = GHICHU;

            cmd.CommandText = "INSERT INTO CSKH_IMPTEST_07052019 (ma_tb,ghichu) VALUES (:2, :3)";

            cmd.Parameters.Add(mA_TB);
            cmd.Parameters.Add(gHICHU);

            cmd.ExecuteNonQuery();
            oraclecon.Close();

2 个答案:

答案 0 :(得分:0)

这是因为您已将整个字符串数组分配给了数据库参数:

        string[] MA_TB = new string[dt.Rows.Count];

        …

        mA_TB.Value = MA_TB;

        …

        cmd.Parameters.Add(mA_TB);

不仅仅是数组中的字符串值之一。这意味着您将插入System.String[]作为“字符串”,而不是"Hello World"或其他名称。发生这种情况的原因是,当您调用Convert.ToString(someobject)时,将在内部调用someobject.ToString()。在没有任何覆盖方法的情况下(并且字符串数组将没有任何覆盖),将调用默认的ToString(),并且所有操作都会返回对象类型的名称-在这种情况下为字符串数组

选择数组项之一作为参数值:

        mA_TB.Value = MA_TB[0];

或者如果您想全部使用它们,例如用逗号分隔,将它们连成一个字符串:

        mA_TB.Value = String.Join(",", MA_TB);

编辑:

将dt中的所有行插入到数据库中,让我们使用这些应该被使用的东西(设置命令和参数,重复更改参数的值并执行)。

        DataTable dt = ds.Tables[0];
        OracleConnection oraclecon = (OracleConnection)db.Database.Connection;

        // create command and set properties  
        OracleCommand cmd = oraclecon.CreateCommand() as OracleCommand;
        cmd.CommandText = "INSERT INTO CSKH_IMPTEST_07052019 (ma_tb,ghichu) VALUES (:2, :3)";
        OracleParameter mA_TB = new OracleParameter();
        mA_TB.OracleDbType = OracleDbType.Varchar2;
        cmd.Parameters.Add(mA_TB);

        OracleParameter gHICHU = new OracleParameter();
        gHICHU.OracleDbType = OracleDbType.Varchar2;
        cmd.Parameters.Add(gHICHU);

        oraclecon.Open();

        foreach(DataRow ro in dt.Rows)
        {
            mA_TB.Value = ro["MA_TB"].ToString();
            gHICHU.Value = ro["GHICHU"].ToString();
            cmd.ExecuteNonQuery();
        }

        oraclecon.Close();

答案 1 :(得分:0)

我有一个与Epplus和Entity Framework相似的任务,通过遍历Excel表并创建新对象,然后将它们添加到数据库中来完成。 互联网上有很多例子。

Epplus的示例:

public ActionResult Import(HttpPostedFileBase upload)
{
    var users = new List<User>();
    var excelPackage = new ExcelPackage(upload.InputStream);
    // Reading the first worksheet
    var worksheet = excelPackage.Workbook.Worksheets[1];
    // Number of rows and columns
    int totalRows = worksheet.Dimension.Rows;
    int totalCols = expectedHeaders.Count();

    for (int row = 1; row <= totalRows; row++)
    {
        // Filling variables or creating objects
        var Name = worksheet.Cells[row, 1].Text;
...
    }
...
}

然后,您可以遍历列表,在其中可以将项目添加到数据库中。