TransWikia.com

Primary Key с использованием new

Stack Overflow на русском Asked on November 5, 2021

Объясните, пожалуйста,

customers.PrimaryKey = new DataColumn[] { customers.Columns[0] };

В строке 54 немного странный синтаксис. Ключ накладывается на первый столбец массива? Но почему не записать как имятаблицы.имястолбца зачем обязательно как массив записывать? И причем здесь new?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

// 

namespace CBS.ADO_NET.TableConstraints
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string connectionString = @"Data Source=.SQLEXPRESS; Initial Catalog=ShopDB; Integrated Security=True;"; // создание строки подключения

            DataSet ds = new DataSet();
            DataTable customers = new DataTable("Customers");
            DataTable orders = new DataTable("Orders");

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand customersCmd = new SqlCommand("SELECT CustomerNo, LName, FName, Address1, Phone FROM Customers", connection);
                SqlCommand ordersCmd = new SqlCommand("SELECT OrderID, CustomerNo, OrderDate FROM Orders", connection);

                SqlDataReader ordersReader = ordersCmd.ExecuteReader(); // получение DataReader для таблицы OrderDetails

                // метод LoadWithSchema позволяет на основе объекта DataReader создать объект DataTable 
                //с ограничениями для столбцов как в базе данных и заполнить эту таблицу данными
                orders.LoadWithSchema(ordersReader);
                ordersReader.Close();

                SqlDataReader customersReader = customersCmd.ExecuteReader();
                customers.LoadWithSchema(customersReader);
                customersReader.Close();
            }

            // объект DataReader не имеет информации об ограничениях объектов DataTable, таких как 
            // UniqueConstraint, ForeignKeyConstraint и PrimaryKey, поэтому прийдется их создать вручную
            customers.PrimaryKey = new DataColumn[] { customers.Columns[0] }; 
            ds.Tables.AddRange(new DataTable[] { customers, orders }); 

            // создание ограничения ForeignKeyConstraint для таблицы OrderDetails
            var FK_CustomersOrders = new ForeignKeyConstraint(customers.Columns["CustomerNo"], orders.Columns["CustomerNo"]);
            orders.Constraints.Add(FK_CustomersOrders);

            parentGridView.DataSource = customers; // связывание элемента управления parentGridView с таблицей Products
            childDataGridView.DataSource = orders; // Связывание элемента управления childDataGridView c таблицей OrderDetails
        }
    }
}


2 Answers

В чём тут сранного я не пойму.

customers.PrimaryKey = new DataColumn[] { customers.Columns[0] }; 

Создание и инициализация массива типа DataColumn; почитайте тут

а то что customers.Columns[0] так это их выбор.

Захотели первый зная что там ключ, если вы знаете что ключ в правом кармане будите ли вы искать его в левом?

Answered by Aziz Umarov on November 5, 2021

DataTable.PrimaryKey принимает массив столбцов, а не столбец, потому как первичный ключ таблицы может состоять из нескольких столбцов.

Поэтому при присвоении свойству значения создается массив типа DataColumn с единственным элементом. Его здесь объявили как можно более явно для наглядности, можно было и короче:

customers.PrimaryKey = { customers.Columns[0] };

В качестве столбца указан первый столбец таблицы customers, т.е. столбец с индексом 0. Можно было бы и указать столбец по имени.

customers.PrimaryKey = { customers.Columns["CustomerNo"] };

Answered by default locale on November 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP