Имена столбцов в каждой таблице должны быть уникальным исключением - PullRequest
0 голосов
/ 12 февраля 2019

Имена столбцов в каждой таблице должны быть уникальными.Имя столбца «Доставка» в таблице «Продажи» указывается более одного раза.

Как я могу решить эту проблему?Я получаю System.Data.SqlClient.SqlException.

class DataAccess
{
    string ConnectionString;

    public DataAccess()
    {
        ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CafeteriaDBConnectionString"].ConnectionString;
    }        



    public bool RecordASale(ArrayList ProductsList, DateTime SaleTime, int SalesmanID, decimal CashGiven, decimal TotalBill, decimal CashReturn, string Delivery)
    {
        int SaleID = ReturnSaleID();

        using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
            connection.Open();
            using (SqlCommand command = new SqlCommand("alter table [Sales] add [Delivery] varchar default 5 NOT NULL"))
            {
                command.Connection = connection;
                command.ExecuteNonQuery();
            }
        }

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

            /*Start a local transaction*/
            SqlTransaction sqlTran = connection.BeginTransaction();

            /*Enlist a command in the current transaction*/
            SqlCommand command = connection.CreateCommand();
            command.Transaction = sqlTran;

            try
            {
                // Execute separate commands.
                command.Parameters.AddWithValue("@SaleTime", SaleTime);
                command.Parameters.AddWithValue("@SalesmanID", SalesmanID);
                command.Parameters.AddWithValue("@CashGiven", CashGiven);
                command.Parameters.AddWithValue("@TotalBill", TotalBill);
                command.Parameters.AddWithValue("@CashReturn", CashReturn);
                /*command.Parameters.AddWithValue("@Delivery", Delivery);*/

                command.CommandText =
                   "Insert into Sales (SaleTime, SalesmanID, CashGiven, TotalBill, CashReturn, Delivery) values (@SaleTime, @SalesmanID, @CashGiven, @TotalBill, @CashReturn, @Delivery)";
                command.ExecuteNonQuery();

                foreach (Details ProductDetail in ProductsList)
                {
                    //// Execute separate commands.
                    //command.Parameters.AddWithValue("@ProductName", ProductDetail.Name);
                    //command.Parameters.AddWithValue("@ProductPrice", ProductDetail.Price);
                    //command.Parameters.AddWithValue("@ProductQuantity", ProductDetail.Quantity);
                    //command.Parameters.AddWithValue("@ProductTotal", ProductDetail.Total);
                    //command.Parameters.AddWithValue("@SaleID", SaleID);

                    command.CommandText =
                       "Insert into SaleItems (ProductName, ProductPrice, ProductQuantity, ProductTotal, SaleID) values ('" + ProductDetail.Name + "', '" + ProductDetail.Price + "', '" + ProductDetail.Quantity + "', '" + ProductDetail.Total + "', '" + SaleID + "')";
                    command.ExecuteNonQuery();
                }

                // Commit the transaction.
                sqlTran.Commit();

                //connection.Close();

                return true;
            }
            catch (Exception ee)
            {
                throw ee;
            }
        }
    }

1 Ответ

0 голосов
/ 12 февраля 2019

Если вы хотите проверить, существует ли ваш столбец, прежде чем добавлять его в таблицу данных, вы должны изменить свой код следующим образом

 string sql = @"if NOT exists(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
                    WHERE Column_Name = 'Delivery' AND Table_Name = 'Sales')  
                    ALTER TABLE Sales ADD Delivery VARCHAR DEFAULT 5 NOT NULL";
 using (SqlCommand command = new SqlCommand(sql))
 {
      command.Connection = connection;
      command.ExecuteNonQuery();
 }

Таким образом, операция по добавлению столбца Доставка в таблицу Продажи будетвыполняться только в том случае, если запрос INFORMATION_SCHEMA.COLUMNS не возвращает значение

. Я также заметил, что теперь вы строите свою команду INSERT, объединяющую строки вместе.Это хорошо известная проблема безопасности, которую вы можете узнать о поиске того, как ее можно использовать для Sql Injection

Кроме того, если столбец SalesID является столбцом Identity, вам не следует пытаться передать его значение вSQL запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...