[英]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,
像這樣:
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#中的過程?
最好的想法是遵循下面提到的步驟
關於你的這部分問題:
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.