private OracleDataAdapter odad;
public static int InsertBatch(DataTable dt, List<OracleType> DbTypeList,string strtable)
{
getConnection();
int count = 0;
string strfields = "";
string strvalues = "";
for (int i = 0; i < dt.Columns.Count; i++)
{
string strfiled = dt.Columns[i].ColumnName;
strfields += strfiled + ",";
strvalues += "@" + strfiled + ",";
}
if (strfields != "")
{
strfields = strfields.Substring(0, strfields.LastIndexOf(","));
strvalues = strvalues.Substring(0, strvalues.LastIndexOf(","));
}
try
{
if (ocon.State != ConnectionState.Open) ocon.Open();
odad = new OracleDataAdapter();
//建立InsertCommand
StringBuilder sb = new StringBuilder("");
sb.Append("INSERT into " + strtable + " (" + strfields + ") VALUES(");
sb.Append(strvalues + ")");
odad.InsertCommand = new OracleCommand();
odad.InsertCommand.CommandText = sb.ToString();
odad.InsertCommand.Connection = ocon;
for (int i = 0; i < dt.Columns.Count; i++)
{
string filed = dt.Columns[i].ColumnName;
string strvalue = "@" + filed;
OracleParameter oparam = new OracleParameter();
oparam.ParameterName = strvalue;
oparam.OracleType = DbTypeList[i];
oparam.SourceVersion = DataRowVersion.Current;
oparam.SourceColumn = filed;
odad.InsertCommand.Parameters.Add(oparam);
}
count = odad.Update(dt);
}
catch (Exception ex)
{
count = 0;
}
finally
{
if (ocon != null)
ocon.Close();
}
return count;
}
方法中的参数List<OracleType> DbTypeList,是与dt中每一列一一对应的
执行到count = odad.Update(dt);的时候没有异常,也并未将数据插入到数据库中,请问各位,怎么才能执行DataTable的批量导入Oracle数据库操作啊?
17 个解决方案
#1
⊙﹏⊙b汗,沉的好快啊,自己顶一下
#2
如果是Oracle 11G的话可以引用Oracle.DataAccess.dll中使用OracleBulkCopy批量导入数据,效率很高
catch (Exception ex)
{
count = 0;
}
异常被捕获掉了,你可以去掉之后看是不是报异常
catch (Exception ex)
{
count = 0;
}
异常被捕获掉了,你可以去掉之后看是不是报异常
#3
我是走的断点,如果异常的话应该会走catch块的,不过并没有执行catch块…………用的是Oracle10G…………
#4
事务是批量导入的关键
#5
唉…………又沉了…………
#6
是不得用Command.Prepare()
#7
楼主好像忘记设置oparam.Value了
#8
呃………………oparam.Value…………在SQLServer中貌似不用设置啊…………要怎么设置?循环提取每一个字段的值并赋值吗?
#9
唉…………贴沉大海了…………
#10
再顶一下吧…………
#11
帮楼主顶一下了
#12
...
#13
二楼推荐的BulkCopy应该是效率最高的。
#14
来看看别人是怎么导入的,学习一下
#15
有比较详细一点的讲解吗?确实没用过OracleBulkCopy,而且我用的是Oracle10g
#16
ddddddddddddddddddddddddddddddddddddddddddddddd
#17
#1
⊙﹏⊙b汗,沉的好快啊,自己顶一下
#2
如果是Oracle 11G的话可以引用Oracle.DataAccess.dll中使用OracleBulkCopy批量导入数据,效率很高
catch (Exception ex)
{
count = 0;
}
异常被捕获掉了,你可以去掉之后看是不是报异常
catch (Exception ex)
{
count = 0;
}
异常被捕获掉了,你可以去掉之后看是不是报异常
#3
我是走的断点,如果异常的话应该会走catch块的,不过并没有执行catch块…………用的是Oracle10G…………
#4
事务是批量导入的关键
#5
唉…………又沉了…………
#6
是不得用Command.Prepare()
#7
楼主好像忘记设置oparam.Value了
#8
呃………………oparam.Value…………在SQLServer中貌似不用设置啊…………要怎么设置?循环提取每一个字段的值并赋值吗?
#9
唉…………贴沉大海了…………
#10
再顶一下吧…………
#11
帮楼主顶一下了
#12
...
#13
二楼推荐的BulkCopy应该是效率最高的。
#14
来看看别人是怎么导入的,学习一下
#15
有比较详细一点的讲解吗?确实没用过OracleBulkCopy,而且我用的是Oracle10g
#16
ddddddddddddddddddddddddddddddddddddddddddddddd