Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 400 401 402 403 404 405 406 407 408 ... 642

<b>private readonly PropertyInfo[] _propertyInfos;</b>

<b>private readonly Dictionary&lt;int, string&gt; _nameDictionary;</b>

public MyDataReader(List&lt;T&gt; records)

{

  Records = records;

<b>  _propertyInfos = typeof(T).GetProperties();</b>

<b>  _nameDictionary = new Dictionary&lt;int,string&gt;();</b>

}

Модифицируйте конструктор, чтобы он принимал строку подключения SQLConnection, а также строки для имен схемы и таблицы, куда будут вставлены записи, и добавьте для этих значений переменные уровня класса:

<b>private readonly SqlConnection _connection;</b>

<b>private readonly string _schema;</b>

<b>private readonly string _tableName;</b>

public MyDataReader(List&lt;T&gt; records, <b>SqlConnection connection</b>,

                    <b>string schema, string </b><b>tableName</b>)

{

  Records = records;

  _propertyInfos = typeof(T).GetProperties();

  _nameDictionary = new Dictionary&lt;int, string&gt;();

<b>  _connection = connection;</b>

<b>  _schema = schema;</b>

<b>  _tableName = tableName;</b>

}

Далее реализуйте метод GetSchemaTable(), который извлекает информацию SQL Server, касающуюся целевой таблицы:

public DataTable GetSchemaTable()

{

  using var schemaCommand =

    new SqlCommand($&quot;SELECT * FROM {_schema}.{_tableName}&quot;, _connection);

  using var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly);

  return reader.GetSchemaTable();

}

Модифицируйте конструктор, чтобы использовать SchemaTable для создания словаря, который содержит поля целевой таблицы в порядке их следования внутри базы данных:

public MyDataReader(List&lt;T&gt; records, <b>SqlConnection connection</b>,

                    <b>string schema, string tableName</b>)

{

  ...

<b>  DataTable schemaTable = GetSchemaTable();</b>

<b>  for (int x = 0; x&lt;schemaTable?.Rows.Count;x++)</b>

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

<b>  {</b>

<b>    DataRow col = schemaTable.Rows[x];</b>

<b>    var columnName = col.Field&lt;string&gt;(&quot;ColumnName&quot;);</b>

<b>    _nameDictionary.Add(x,columnName);</b>

  }

}

Теперь показанные далее методы могут быть реализованы обобщенным образом, используя полученную посредством рефлексии информацию:

public int FieldCount =&gt; _propertyInfos.Length;

public object GetValue(int i)

  =&gt; _propertyInfos

      .First(x=&gt;x.Name.Equals(_nameDictionary[i],

                              StringComparison.OrdinalIgnoreCase))

      .GetValue(Records[_currentIndex]);

Для справки ниже приведены остальные методы, которые должны присутствовать (но не реализованы):

public string GetName(int i) =&gt; throw new NotImplementedException();

public int GetOrdinal(string name) =&gt; throw new NotImplementedException();

public string GetDataTypeName(int i) =&gt; throw new NotImplementedException();

public Type GetFieldType(int i) =&gt; throw new NotImplementedException();

public int GetValues(object[] values) =&gt; throw new NotImplementedException();

public bool GetBoolean(int i) =&gt; throw new NotImplementedException();

public byte GetByte(int i) =&gt; throw new NotImplementedException();

public long GetBytes(int i, long fieldOffset, byte[] buffer,

  int bufferoffset, int length)

  =&gt; throw new NotImplementedException();

public char GetChar(int i) =&gt; throw new NotImplementedException();

public long GetChars(int i, long fieldoffset, char[] buffer,

   int bufferoffset, int length)

   =&gt; throw new NotImplementedException();

public Guid GetGuid(int i) =&gt; throw new NotImplementedException();

public short GetInt16(int i) =&gt; throw new NotImplementedException();

public int GetInt32(int i) =&gt; throw new NotImplementedException();

public long GetInt64(int i) =&gt; throw new NotImplementedException();

public float GetFloat(int i) =&gt; throw new NotImplementedException();

public double GetDouble(int i)  =&gt; throw new NotImplementedException();

1 ... 400 401 402 403 404 405 406 407 408 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий