簡體   English   中英

如何將數據從DataTable插入Oracle數據庫表:

[英]How to Insert Data from DataTable to Oracle Database Table :

我在DataTable有2行3列的數據。 我想將該數據插入Oracle表。

我怎么插入? 請給我一些例子。

並且

如何將數據表傳遞給ORACLE中的 storedprocedure ...

我以下面的方式傳遞數據表,但數據表類型問題正在進行中。 我該怎么解決這個問題?

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

想要將數據集或數據表插入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);

要么

如果上面的工作不能比將數據表作為xml參數傳遞而不是處理它

有關詳細信息,請檢查: ADO.NET DataTable作為Oracle / SQL Server數據庫存儲過程的XML參數

要么

在Oracle站點上檢查此線程: 線程:將數據表傳遞給Oracle存儲過程

檢查現有答案: 如何將數據表作為輸入傳遞給C#中的過程?

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

  1. 創建一個事務
  2. 開始交易
  3. 遍歷數據表
  4. 打電話給你的程序
  5. 如果沒有發生錯誤提交事務
  6. 否則回滾交易

關於你的這部分問題:

cmd.Parameters.Add( “@詳細信息”,dtSupplier);
(要么)
cmd.Parameters.Add(“Details”,DbType.Single).Value = dtSupplier.ToString();

“詳細信息”參數的類型是什么? 它是單身嗎? 然后你必須從你的DataTable中選擇一(1)個值並將它傳遞給你的參數,比如dtSupplier.Rows [0] [“col”]。
如果你使用dtSupplier.ToString(),你只需要創建一個整個DataTable的字符串(我猜這將永遠是DataTable的類型名稱)。

首先,您需要在Visual Studio中添加Oracle.DataAccess.dll作為參考。 在大多數情況下,您可以在目錄C:\\ProgramData\\Oracle11g\\product\\11.2.0\\client_1\\ODP.NET\\bin\\2.x\\Oracle.DataAccess.dll找到此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;
}
              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);
                }

我對這個答案非常晚了,但我闡述了一下,有一些更可讀的(我希望)代碼,並避免所有這些.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";

希望這對某些人來說仍然有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM