2012-12-13 78 views
0

我在DataTable中有2行3列的数据。我想将该数据插入Oracle表中。如何将数据从DataTable插入Oracle数据库表:

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

而且还

如何传递数据表中ORACLE为StoredProcedure ...

我通过以下方式mensioned数据表,但数据表类型的问题是正在添加。我该如何解决这个问题?

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

你能提供“型问题”你看到了什么?它会帮助那些想要帮助你解决问题的人。 – Henrik

回答

0

最好的办法将遵循以下

  1. 提到的步骤是通过你的数据表
  2. 创建一个交易
  3. 开始事务
  4. 环打电话给你的程序
  5. 如果提交事务没有发生错误
  6. 别的回滚事务
0

关于你的问题,这部分:

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

“Details”参数的类型是什么?它是单身吗?然后,你必须从你的DataTable中选择一个(1)值并将其传递给你的参数,比如dtSupplier.Rows [0] [“col”]。
如果你使用dtSupplier.ToString(),你只是做一个整个DataTable的字符串(我猜将始终是DataTable的类型名称)。

2

要插入数据集或数据表到ORACLE,

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

这样的:

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

da.InsertCommand = cmdOra; 
da.Update(dsDataSet); 

OR

如果以上不超过工作准证数据表作为XML prameter比低于过程中它

查询详情: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#?

+0

我从来没有通过过程中的数据集或数据表。你能举出一些采取以上任何一种方法的例子并更新。 –

+0

@krshekhar - 看看这个http://stackoverflow.com/questions/12025085/how-to-pass-datatable-as-input-to-procedure-in-c –

0

首先,你需要添加Oracle.DataAccess.dll在Visual Studio中的参考。在大多数情况下,您可以在目录中找到此dll C:\ProgramData\Oracle11g\product\11.2.0\client_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll

如果您只需要将记录从DataTable插入到Oracle表中,则可以调用以下函数。考虑你的DataTable名称是dt

string error = ""; 
int noOfInserts = DataTableToTable(dt,out error); 

1.在不使用Oracle参数

函数的定义如下(特殊字符非安全)。在这里,我们只是将查询动态地作为sql语句传递给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函数的代码如下所示。在这里,在连接字符串中你必须把你的数据库的细节,如主机,用户名,密码等

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; 
} 

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

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下面

public string InsertWithParams(string sql, List<string> colValue, List<string> cols, out string error) 
{ 
    error = ""; 
    try 
    { 
     OracleConnection con = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=)))(CONNECT_DATA=(SERVER=DEDICATED)(SID=)));User Id=;Password="); 
     OracleCommand command = new OracleCommand(sql, con); 
     for (int i = 0; i < colValue.Count; i++) 
     { 
       command.Parameters.Add(new OracleParameter(cols[i], colValue[i])); 
     } 
     command.ExecuteNonQuery(); 
     command.Connection.Close(); 
    } 
    catch (Exception ex) 
    { 
     error = ex.Message; 
    } 
    return null; 
} 
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); 
       } 
0

给予我非常迟到了这个答案,但我阐述了一下,有一些更可读的(我希望)代码,并且为了避免所有那些.ToString()的值可以被处理,所以null和其他较不常见的值;这就是:

public void Copy(String tableName, DataTable dataTable) 
{ 
    var insert = $"insert into {tableName} ({GetColumnNames(dataTable)}) values ({GetParamPlaceholders(dataTable)})"; 
    using (var connection = /*a method to get a new open connection*/) 
    {  
     for (var row = 0; row < dataTable.Rows.Count; row++) 
     { 
      InsertRow(dataTable, insert, connection, row); 
     } 
    } 
} 

private static void InsertRow(DataTable dataTable, String insert, OracleConnection connection, Int32 row) 
{ 
    using (var command = new OracleCommand(insert, connection)) 
    { 
     AssembleParameters(dataTable, command, row); 
     command.ExecuteNonQuery(); 
    } 
} 

private static void AssembleParameters(DataTable dataTable, OracleCommand command, Int32 row) 
{ 
    for (var col = 0; col < dataTable.Columns.Count; col++) 
    { 
     command.Parameters.Add(ParameterFor(dataTable, row, col)); 
    } 
} 

private static OracleParameter ParameterFor(DataTable dataTable, Int32 row, Int32 col) 
{ 
    return new OracleParameter(GetParamName(dataTable.Columns[col]), dataTable.Rows[row].ItemArray.GetValue(col)); 
} 

private static String GetColumnNames(DataTable data) => (from DataColumn column in data.Columns select column.ColumnName).StringJoin(", "); 

private static String GetParamPlaceholders(DataTable data) => (from DataColumn column in data.Columns select GetParamName(column)).StringJoin(", "); 

private static String GetParamName(DataColumn column) => $":{column.ColumnName}_param"; 

希望这能仍然是有用的给别人

相关问题