En iyi yanıtlayıcılar
Aynı anahtara sahip özellik zaten eklenmiş hatası

Soru
-
Merhaba Arkadaşlar
Daha öncede farklı tablodalar kullanmış olduğumu fakat yeni bir tabloya insert de kullanacağım özellik nedense Aynı anahtara sahip özellik zaten eklenmiş hatası hatasını veriyor. Hatayı ObjectDataReader metodundaki this.ordinalLookup = sorgusunda veriyor.
public ObjectDataReader(IEnumerable<TData> data) { this.dataEnumerator = data.GetEnumerator(); // Get all the readable properties for the class and // compile an expression capable of reading it var propertyAccessors = typeof(TData) .GetProperties(BindingFlags.Instance | BindingFlags.Public) .Where(p => p.CanRead) .Select((p, i) => new { Index = i, Property = p, Accessor = CreatePropertyAccessor(p) }) .ToArray(); this.accessors = propertyAccessors.Select(p => p.Accessor).ToArray(); this.ordinalLookup = propertyAccessors.ToDictionary( p => p.Property.Name, p => p.Index, StringComparer.OrdinalIgnoreCase); }
public void UrunKayit(IEnumerable<URUNLER> urun, SqlConnection connection,
SqlTransaction tran) { using (var bulk = new SqlBulkCopy(connection,
SqlBulkCopyOptions.KeepIdentity, tran)) { bulk.BulkCopyTimeout = 99999; bulk.DestinationTableName = "URUNLER"; bulk.ColumnMappings.Add("urun_id", "urun_id"); bulk.ColumnMappings.Add("urun_kodu", "urun_kodu"); bulk.ColumnMappings.Add("urun_adi", "urun_adi"); using (var dataReader = new ObjectDataReader<URUNLER>(urun)) { bulk.WriteToServer(dataReader); } } }
Yanıtlar
-
DataTable' a yazacağım diye uğrşma,
public class ObjectDataReader<T> : IDataReader { private readonly IList<FieldInfo> _properties; private readonly IEnumerator _enumarator; public ObjectDataReader(IEnumerable<T> data) { _enumarator = data.GetEnumerator(); Depth = 0; IsClosed = false; _properties = typeof(T).GetFields().ToList(); FieldCount = _properties.Count; RecordsAffected = 0; } private object Current => _enumarator.Current; public void Close() { } public DataTable GetSchemaTable() { throw new NotImplementedException(); } public bool GetBoolean(int ordinal) { return (bool)GetValue(ordinal); } public byte GetByte(int ordinal) { return (byte)GetValue(ordinal); } public long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length) { throw new NotImplementedException(); } public char GetChar(int ordinal) { return (char)GetValue(ordinal); } public long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length) { throw new NotImplementedException(); } public string GetDataTypeName(int ordinal) { return GetValue(ordinal).GetType().Name; } public DateTime GetDateTime(int ordinal) { return (DateTime)GetValue(ordinal); } public IDataReader GetData(int i) { throw new NotImplementedException(); } public decimal GetDecimal(int ordinal) { return (decimal)GetValue(ordinal); } public double GetDouble(int ordinal) { return (double)GetValue(ordinal); } public IEnumerator GetEnumerator() { return _enumarator; } public bool NextResult() { return _enumarator.MoveNext(); } public bool Read() { return _enumarator.MoveNext(); } public int Depth { get; } public bool IsClosed { get; } public int RecordsAffected { get; } public object this[string name] { get { return _properties.First(x => x.Name == name).GetValue(Current); } } public object this[int ordinal] => GetValue(ordinal); public int FieldCount { get; } public bool HasRows { get; } public bool IsDBNull(int ordinal) { return GetValue(ordinal) == null; } public int GetValues(object[] values) { throw new NotImplementedException(); } public object GetValue(int ordinal) { var property = _properties[ordinal]; return property.GetValue(Current); } public string GetString(int ordinal) { return (string)GetValue(ordinal); } public int GetOrdinal(string name) { return _properties.IndexOf(_properties.First(x => x.Name == name)); } public string GetName(int ordinal) { return _properties[ordinal].Name; } public long GetInt64(int ordinal) { return (long)_properties[ordinal].GetValue(Current); } public int GetInt32(int ordinal) { return (int)_properties[ordinal].GetValue(Current); } public short GetInt16(int ordinal) { return (short)_properties[ordinal].GetValue(Current); } public Guid GetGuid(int ordinal) { return (Guid)_properties[ordinal].GetValue(Current); } public float GetFloat(int ordinal) { return (float)_properties[ordinal].GetValue(Current); } public Type GetFieldType(int ordinal) { return _properties[ordinal].FieldType; } public void Dispose() { } }
Bu sınıfı ekle projene şöyle de bir extension yaz :
public static void BulkCopy<T>(this IList<T> data, SqlConnection connection, SqlTransaction transaction) { using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.CheckConstraints, transaction)) { bulkCopy.BulkCopyTimeout = 9000; bulkCopy.DestinationTableName = typeof(T).Name; bulkCopy.WriteToServer(new ObjectDataReader<T>(data)); } }
Tablo adı farklı olabiliyorsa parametreye çekersin.
Core kullanıyorsan ilk sınıf çalışmayacaktır. Ona göre yazılmışı da var elimde :) Çocukla gönderirim.
İlk hatanın başka sebebi olamaz :)
- Düzenleyen Cihan YakarMVP 2 Şubat 2017 Perşembe 08:28
- Yanıt Olarak İşaretleyen csharpp 2 Şubat 2017 Perşembe 23:05
Tüm Yanıtlar
-
Aynı property nin farklı karakter boyutunda birden fazla hali vardır :
public string Name {get;set;} public string name {get;set;}
gibi...
BU ikisi farklı algılansın istiyorsan StringComparer.OrdinalIgnoreCase kısmını değiştirmelisin.
- Düzenleyen Cihan YakarMVP 2 Şubat 2017 Perşembe 06:52
-
-
bu metotud kullanıyorum artık
public static void BulkInsert<T>(string tableName, IList<T> list, SqlConnection con, SqlTransaction tran) { using (var bulkCopy = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, tran)) { bulkCopy.BatchSize = list.Count; bulkCopy.DestinationTableName = tableName; bulkCopy.BulkCopyTimeout = 99999; //SqlBulkCopyColumnMapping clm =null; var table = new DataTable(); var props = TypeDescriptor.GetProperties(typeof(T)) //Dirty hack to make sure we only have system data types //i.e. filter out the relationships/collections .Cast<PropertyDescriptor>() .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System")) .ToArray(); foreach (var propertyInfo in props) { //clm = new SqlBulkCopyColumnMapping(); bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name); table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType); } var values = new object[props.Length]; foreach (var item in list) { for (var i = 0; i < values.Length; i++) { values[i] = props[i].GetValue(item); } table.Rows.Add(values); } bulkCopy.WriteToServer(table); } }
-
-
DataTable' a yazacağım diye uğrşma,
public class ObjectDataReader<T> : IDataReader { private readonly IList<FieldInfo> _properties; private readonly IEnumerator _enumarator; public ObjectDataReader(IEnumerable<T> data) { _enumarator = data.GetEnumerator(); Depth = 0; IsClosed = false; _properties = typeof(T).GetFields().ToList(); FieldCount = _properties.Count; RecordsAffected = 0; } private object Current => _enumarator.Current; public void Close() { } public DataTable GetSchemaTable() { throw new NotImplementedException(); } public bool GetBoolean(int ordinal) { return (bool)GetValue(ordinal); } public byte GetByte(int ordinal) { return (byte)GetValue(ordinal); } public long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length) { throw new NotImplementedException(); } public char GetChar(int ordinal) { return (char)GetValue(ordinal); } public long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length) { throw new NotImplementedException(); } public string GetDataTypeName(int ordinal) { return GetValue(ordinal).GetType().Name; } public DateTime GetDateTime(int ordinal) { return (DateTime)GetValue(ordinal); } public IDataReader GetData(int i) { throw new NotImplementedException(); } public decimal GetDecimal(int ordinal) { return (decimal)GetValue(ordinal); } public double GetDouble(int ordinal) { return (double)GetValue(ordinal); } public IEnumerator GetEnumerator() { return _enumarator; } public bool NextResult() { return _enumarator.MoveNext(); } public bool Read() { return _enumarator.MoveNext(); } public int Depth { get; } public bool IsClosed { get; } public int RecordsAffected { get; } public object this[string name] { get { return _properties.First(x => x.Name == name).GetValue(Current); } } public object this[int ordinal] => GetValue(ordinal); public int FieldCount { get; } public bool HasRows { get; } public bool IsDBNull(int ordinal) { return GetValue(ordinal) == null; } public int GetValues(object[] values) { throw new NotImplementedException(); } public object GetValue(int ordinal) { var property = _properties[ordinal]; return property.GetValue(Current); } public string GetString(int ordinal) { return (string)GetValue(ordinal); } public int GetOrdinal(string name) { return _properties.IndexOf(_properties.First(x => x.Name == name)); } public string GetName(int ordinal) { return _properties[ordinal].Name; } public long GetInt64(int ordinal) { return (long)_properties[ordinal].GetValue(Current); } public int GetInt32(int ordinal) { return (int)_properties[ordinal].GetValue(Current); } public short GetInt16(int ordinal) { return (short)_properties[ordinal].GetValue(Current); } public Guid GetGuid(int ordinal) { return (Guid)_properties[ordinal].GetValue(Current); } public float GetFloat(int ordinal) { return (float)_properties[ordinal].GetValue(Current); } public Type GetFieldType(int ordinal) { return _properties[ordinal].FieldType; } public void Dispose() { } }
Bu sınıfı ekle projene şöyle de bir extension yaz :
public static void BulkCopy<T>(this IList<T> data, SqlConnection connection, SqlTransaction transaction) { using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.CheckConstraints, transaction)) { bulkCopy.BulkCopyTimeout = 9000; bulkCopy.DestinationTableName = typeof(T).Name; bulkCopy.WriteToServer(new ObjectDataReader<T>(data)); } }
Tablo adı farklı olabiliyorsa parametreye çekersin.
Core kullanıyorsan ilk sınıf çalışmayacaktır. Ona göre yazılmışı da var elimde :) Çocukla gönderirim.
İlk hatanın başka sebebi olamaz :)
- Düzenleyen Cihan YakarMVP 2 Şubat 2017 Perşembe 08:28
- Yanıt Olarak İşaretleyen csharpp 2 Şubat 2017 Perşembe 23:05
-