为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8_20220719_x86_rh6_64_sec_8.1.2.128_pack2
【操作系统】:Windows / Linux
【CPU】:x86
【问题描述】*:.net DMBulkCopy Clob字段间隔性丢失
测试好多天了,程序不报错,就是有些计划导入后为空,也不是长度太长问题,
.net 驱动最新版本,从oracle 最导数据共699条,导入后一般是100来条不正确
如果,sqlbulkcopy.BatchSize = 1;改为1就正常
核心代码
using DmBulkCopy sqlbulkcopy = new((DmConnection)connction);
sqlbulkcopy.DestinationTableName = tableName;
//sqlbulkcopy.BatchSize = 1;
if (!dr.IsClosed) {
int fieldCount = dr.FieldCount;
for (int i = 0; i < fieldCount; i++) {
string fieldName = dr.GetName(i);
if (!notFields.Contains(fieldName)) {
sqlbulkcopy.ColumnMappings.Add(fieldName, fieldName);
}
}
sqlbulkcopy.WriteToServer(dr);
}
尝试多参数绑定也是一样
private static void ExcuteBat(string sql, DbConnection connction, Dictionary<string, List<object>> dic) {
DmCommand cmd = new DmCommand(sql, (DmConnection)connction);
foreach (var p in dic) {
var s = new DmParameter(p.Key, p.Value.ToArray());
if (p.Key == "O_BODY") {
s.DbType = DbType.StringFixedLength;
s.DmSqlType = DmDbType.Clob;
}
cmd.Parameters.Add(s);
}
cmd.ExecuteNonQuery();
}
无耐有CLOB字段时改为普通SQL插入比较慢,有些表有上亿记录了,整库同步要好几天了。
using System.Data;
using System.Data.Common;
using Dm;
using Newtonsoft.Json;
namespace testdm {
internal class Program {
public const string CONNECT_STR = "Server=******;User Id=****; PWD=****;DATABASE=PROJ_CMSEC_CIRP;PORT=5238";
static void Main(string[] args) {
var json = File.ReadAllText("d:\\dt.json");
var dt = JsonConvert.DeserializeObject<DataTable>(json);
var s = dt.AsEnumerable().Where(m => string.IsNullOrEmpty(m["O_BODY"].ToString())).ToList();
Console.WriteLine("数据为空的:" + s.Count);
DmConnection conn = new DmConnection(CONNECT_STR);
try {
conn.Open();
using DmBulkCopy sqlbulkcopy = new DmBulkCopy(conn);
sqlbulkcopy.DestinationTableName = "TCRT_OBJECT";
sqlbulkcopy.WriteToServer(dt);
}
finally {
conn?.Close();
}
}
}
}
ding
好的,我本地测试下
我本地用你的测试代码没有问题,你数据库版本使用的是那个版本
可以试试最新版本的驱动文件
可以提供部分测试数据及完整代码吗?