我在DataTable
中有2行3列的数据。我想将这些数据插入Oracle
表。
我该如何插入?请给我一些例子。
还
如何将数据表传递给 ORACLE 中的storedprocedure ...
我以下面的方式传递数据表,但数据表类型问题正在进行中。我怎么解决这个问题?
cmd.Parameters.Add("@Details",dtSupplier);
(OR)
cmd.Parameters.Add("Details", DbType.Single).Value = dtSupplier.ToString();
答案 0 :(得分:2)
想要将数据集或数据表插入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 as XML parameter to an Oracle/SQL Server Database Stored Procedure
或强>
在Oracle网站上查看此主题:Thread: Pass data table to Oracle stored procedure
答案 1 :(得分:0)
最好的想法是遵循下面提到的步骤
答案 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
如果只需要将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