none
Aynı anahtara sahip özellik zaten eklenmiş hatası RRS feed

  • 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); } } }

    1 Şubat 2017 Çarşamba 20:29

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
    2 Şubat 2017 Perşembe 08:26

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.



    2 Şubat 2017 Perşembe 06:51
  • Cihan abi sorunu şimdi söyle tespit ettim tablodaki kolon harici bir alan var ise class içerisindeki properyt lerde ondan yapıyor ama benim farklı propertylere de ihtiyacım var bu class içerisinde onları nasıl ayırabilirim.
    2 Şubat 2017 Perşembe 07:09
  • 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);
                }
    
            } 

    2 Şubat 2017 Perşembe 07:10
  • bu arada abim aynı propertynin farklı karakterleri yok.
    2 Şubat 2017 Perşembe 08:15
  • 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
    2 Şubat 2017 Perşembe 08:26
  • Çok teşekkür ederim Cihan abi çok sağol.
    2 Şubat 2017 Perşembe 23:04