如何将数据从DataTable插入Oracle数据库表:

时间:2012-12-13 06:51:54

标签: c# asp.net

我在DataTable中有2行3列的数据。我想将这些数据插入Oracle表。

我该如何插入?请给我一些例子。

如何将数据表传递给 ORACLE 中的storedprocedure ...

我以下面的方式传递数据表,但数据表类型问题正在进行中。我怎么解决这个问题?

cmd.Parameters.Add("@Details",dtSupplier);   
(OR)  
cmd.Parameters.Add("Details", DbType.Single).Value = dtSupplier.ToString();

7 个答案:

答案 0 :(得分:2)

想要将数据集或数据表插入ORACLE,

  1. 创建一个ORACLE数据适配器。
  2. 创建一个用于插入的命令对象,
  3. 将CommandType设置为StoredProcedure。
  4. 更新数据适配器的命令,
  5. 将数据集或数据表作为参数传递。
  6. 像这样:

    OracleDataAdapter da = new OracleDataAdapter();
    OracleCommand cmdOra = new OracleCommand(StoredProcedureName, Connection);
    cmdOra.CommandType = CommandType.StoredProcedure;
    
    da.InsertCommand = cmdOra;
    da.Update(dsDataSet);
    

    如果上面的工作不能比将数据表作为xml参数传递而不是处理它

    详细信息请查看:ADO.NET DataTable as XML parameter to an Oracle/SQL Server Database Stored Procedure

    在Oracle网站上查看此主题:Thread: Pass data table to Oracle stored procedure

    检查现有答案:How to Pass datatable as input to procedure in C#?

答案 1 :(得分:0)

最好的想法是遵循下面提到的步骤

  1. 创建交易
  2. 开始交易
  3. 遍历您的数据表
  4. 致电您的程序
  5. 如果没有发生错误提交事务
  6. 其他回滚交易

答案 2 :(得分:0)

关于你问题的这一部分:

  

cmd.Parameters.Add( “@细节”,dtSupplier);
  (OR)
  cmd.Parameters.Add(“Details”,DbType.Single).Value = dtSupplier.ToString();

“详细信息”参数的类型是什么?它是单身吗?然后你必须从你的DataTable中选择一(1)个值并将它传递给你的参数,比如dtSupplier.Rows [0] [“col”]。
如果你使用dtSupplier.ToString(),你只需要创建一个整个DataTable的字符串(我猜这将永远是DataTable的类型名称)。

答案 3 :(得分:0)

首先,您需要在Visual Studio中添加this作为参考。在大多数情况下,您可以在目录Oracle.DataAccess.dll

中找到此dll

如果只需要将DataTable中的记录插入Oracle表,则可以调用以下函数。请考虑您的DataTable名称为C:\ProgramData\Oracle11g\product\11.2.0\client_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll

dt

<强> 1。不使用Oracle参数(特殊字符不安全)

该功能的定义如下。在这里,我们只是将查询动态化,将其作为sql语句传递给string error = ""; int noOfInserts = DataTableToTable(dt,out error); 函数。

InsertWithQuery

public int DataTableToTable(DataTable dt,out string error) { error = ""; for (int i = 0; i < dt.Rows.Count; i++) { finalSql = "INSERT INTO TABLENAME SELECT "; for (int j = 0; j < dt.Columns.Count; j++) { colValue += "'" + dt.Rows[i][j].ToString() + "',"; } colValue = colValue.Remove(colValue.Length - 1, 1); finalSql += colValue + " FROM DUAL"; InsertWithQuery(finalSql, out error); if (error != "") return error; inserts++; colValue = ""; } } 函数的代码如下。在这里,您必须在连接字符串中放置数据库详细信息,如主机,用户名,密码等。

InsertWithQuery

<强> 2。使用Oracle参数(特殊字符安全)
这可以处理特殊字符,例如列值中的方案之类的单引号。

public int InsertWithQuery(string query, out string error)
{
     error = "";
     int rowsInserted = 0;        
     if (error == "")
     {
          OracleConnection con = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=)))(CONNECT_DATA=(SERVER=DEDICATED)(SID=)));User Id=;Password="); 
          OracleTransaction trans = con.BeginTransaction();              
          try
          {
              error = "";
              OracleCommand cmd = new OracleCommand();
              cmd.Transaction = trans;
              cmd.Connection = con;
              cmd.CommandText = query;
              rowsInserted = cmd.ExecuteNonQuery();
              trans.Commit();
              con.Dispose();
              return rowsInserted;
          }
          catch (Exception ex)
          {
              trans.Rollback();
              error = ex.Message;
              rowsInserted = 0;
          }
          finally
          {
              con.Dispose();
          }
     }
     return rowsInserted;
}

public int DataTableToTable(DataTable dt,out string error) { error = ""; string finalSql = ""; List<string> colValue = new List<string>(); List<string> cols = new List<string>() {"COLUMN1","COLUMN2","COLUMN3"}; for (int i = 0; i < dt.Rows.Count; i++) { finalSql = "INSERT INTO TABLENAME(COLUMN1,COLUMN2,COLUMN3) VALUES(:COLUMN1,:COLUMN2,:COLUMN3) "; for (int j = 0; j < dt.Columns.Count; j++) { colValue.Add(dt.Rows[i][j].ToString()); } objDAL.InsertWithParams(finalSql,colValue,cols, out error); if (error != "") return error; inserts++; colValue.Clear(); } } 在下面给出

InsertWithParams

答案 4 :(得分:0)

              try  {

                    //Suppose you have DataTable dt
                    string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
                                              @"Data Source='Give path of your access database file here';Persist Security Info=False";

                    OleDbConnection dbConn = new OleDbConnection(connectionString);
                    dbConn.Open();
                    using (dbConn)
                    {
                        int j = 0;
                        for (int i = 0; i < 2; i++)
                        {
                            OleDbCommand cmd = new OleDbCommand(
                            "INSERT INTO Participant_Profile ([column1], [column2] , [column3] ) VALUES (@c1 , @c2 , @c3 )", dbConn);
                            cmd.Parameters.AddWithValue("@c1", dt.rows[i][j].ToString());
                            cmd.Parameters.AddWithValue("@c2", dt.rows[i][j].ToString());
                            cmd.Parameters.AddWithValue("@c3", dt.rows[i][j].ToString());
                            cmd.ExecuteNonQuery();
                            j++;
                        }



                    }
                }
                catch (OleDbException exception)
                {
                    Console.WriteLine("SQL Error occured: " + exception);
                }

答案 5 :(得分:0)

非常 迟到这个答案,但我详细说明了一些更具可读性(我希望)的代码,并避免所有这些{ {1}}可以处理值$get_id = $_GET['id']; $lan = $_GET['lan']; $sql = $mysqli -> query("SELECT id, name_$lan, content_$lan, image FROM catalogs WHERE id='$get_id'"); while($row = $sql->fetch_array()){ echo $row['name']; //nothing display } 和其他不太常见的值;这是:

.ToString()

希望这对某些人来说仍然有用

答案 6 :(得分:0)

我知道这件事很重要WHILE,但同样的需求:“将数据从数据表插入到 Oracle 表中”发生在我身上。我找到了这个线程。我也尝试了答案,得出的结论是执行一个

...
cmd.ExecuteNonQuery();
...

在循环中,很糟糕。真的很糟糕。第一件事是性能不好,第二件事是不必要的复杂性,第三件事是不必要的 Oracle 对象(存储过程)。完成所需的时间,比方说 200 行,几乎是 1 分钟,这就是我将其四舍五入的时间。所以希望其他人会发现这对我有帮助,这是我的经验。

我很固执,又搜索了一些,所以我发现this,确实是 2018 年的。但我自己是 2021 年...

所以基本代码是:

using Oracle.ManagedDataAccess.Client; // you don't need other dll, just install this from nuget gallery
using System.Data;
public static void Datatable2Oracle(string tableName, DataTable dataTable)
{
    string connString = "connection string";
    OracleBulkCopy copy= new(connString, OracleBulkCopyOptions.UseInternalTransaction /*I don't know what this option does*/);
    copy.DestinationTableName = tableName; 
    copy.WriteToServer(dataTable);
    copy.Dispose();
}

这应该与原始 oracle DDL 性能相匹配:

create table table_name as select * from other_table_name