Ошибка параметра SqlCommand: «Имя переменной уже объявлено» - PullRequest
0 голосов
/ 08 ноября 2019

Я бы хотел вставлять все элементы построчно после нажатия кнопки «Отправить», но моя переменная «@DrinkName» почему-то осталась такой же и получила ошибки. Пожалуйста, посмотрите мой код и снимок экрана для лучшего понимания.

Category.aspx.cs

protected void BtnSubmit_Click(object sender, EventArgs e)
{
        string connString = "sql database";
        string insertCommand = "INSERT INTO tbDrinks ( DrinkName, DateOfOrder, Qty, UserName, UserCompany) " +
           "values(@DrinkName, @DateOfOrder, @Qty, @UserName, @UserCompany)"; //for testing purpose

        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();

            using (SqlCommand sqlcmd = new SqlCommand(insertCommand, conn))
            {                         
                    sqlcmd.Parameters.AddWithValue("@DrinkName", lblCoffee.Text);
                    sqlcmd.Parameters.AddWithValue("@DrinkName", lblEnglishTea.Text);
                    sqlcmd.Parameters.AddWithValue("@DateOfOrder", DateTime.Today);
                    sqlcmd.Parameters.AddWithValue("@Qty", ddlCoffee.SelectedValue);
                    sqlcmd.Parameters.AddWithValue("@Qty", ddlEnglishTea.SelectedValue);
                    sqlcmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
                    sqlcmd.Parameters.AddWithValue("@UserCompany", txtCompanyName.Text);

                    sqlcmd.ExecuteNonQuery();
            }              
        }
} 

Это Category.aspx, который я создал с различным выпадающим списком для каждого элемента.

<table  class="auto-style6">
    <tr>
        <td class="auto-style9">
            <strong>
                <asp:Label ID="lblCompany" runat="server" Text="Company Name : "></asp:Label>
            </strong>
        </td>
        <td class="auto-style10">
            <strong>
                <asp:TextBox ID="txtCompanyName" runat="server"></asp:TextBox>
            </strong>
        </td>           
    </tr>
</table> 

 <table id="tbHotDrinks" class="auto-style3" border="1" bordercolor="#1FC3F3" runat="server">

    <tr>
        <td>
            <asp:Label ID="lblCoffee" runat="server" Text="Coffee"></asp:Label>
        </td>
        <td class="auto-style2">
            <asp:Image ID="coffee" runat="server" Height="76px" ImageUrl="~/images/coffee.gif" Width="99px" ImageAlign="TextTop" />
        </td>
        <td class="auto-style11">
            <asp:DropDownList ID="ddlCoffee" runat="server">
                <asp:ListItem>Qty</asp:ListItem>
                <asp:ListItem>1</asp:ListItem>
                <asp:ListItem>2</asp:ListItem>
                <asp:ListItem>3</asp:ListItem>
                <asp:ListItem>4</asp:ListItem>
                <asp:ListItem>5</asp:ListItem>
                <asp:ListItem>6</asp:ListItem>
                <asp:ListItem>7</asp:ListItem>
                <asp:ListItem>8</asp:ListItem>
                <asp:ListItem>9</asp:ListItem>
            </asp:DropDownList>
        </td>

    </tr>
    <tr>
        <td>
            <asp:Label ID="lblEnglishTea" runat="server" Text="English Tea"></asp:Label>
        </td>
        <td class="auto-style2">
            <asp:Image ID="Image1" runat="server" Height="76px" ImageUrl="~/images/EnglishTea.gif" Width="99px" ImageAlign="TextTop" />
        </td>
        <td class="auto-style11">
            <asp:DropDownList ID="ddlEnglishTea" runat="server">
                <asp:ListItem>Qty</asp:ListItem>
                <asp:ListItem>1</asp:ListItem>
                <asp:ListItem>2</asp:ListItem>
                <asp:ListItem>3</asp:ListItem>
                <asp:ListItem>4</asp:ListItem>
                <asp:ListItem>5</asp:ListItem>
                <asp:ListItem>6</asp:ListItem>
                <asp:ListItem>7</asp:ListItem>
                <asp:ListItem>8</asp:ListItem>
                <asp:ListItem>9</asp:ListItem>
            </asp:DropDownList>
        </td>

    </tr>
</table>

<asp:Button ID="BtnSubmit" runat="server" OnClick="BtnSubmit_Click" Text="Submit" />

Ниже приведен пример скриншота базы данных, который я хотел бы добавить строка за строкой.

enter image description here

Код, который я пробовал в Category.aspx.cs ниже. Почему-то это все еще не правильно. Я просто хочу самый простой способ сделать это.

    protected void BtnSubmit_Click(object sender, EventArgs e)
    {
        string connString = "Data Source";

        string insertCommand = "INSERT INTO tbDrinks ( DrinkName, DateOfOrder, Qty, UserName, UserCompany) " +
                               "VALUES (@DrinkName, @DateOfOrder, @Qty, @UserName, @UserCompany)";

        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();

            using (SqlCommand sqlcmd = new SqlCommand(insertCommand, conn))
            {                         
                    sqlcmd.Parameters.AddWithValue("@DrinkName", lblCoffee.Text);
                  //  sqlcmd.Parameters.AddWithValue("@DrinkName", lblEnglishTea.Text);
                    sqlcmd.Parameters.AddWithValue("@DateOfOrder", DateTime.Today);
                    sqlcmd.Parameters.AddWithValue("@Qty", ddlCoffee.SelectedValue);
                  //  sqlcmd.Parameters.AddWithValue("@Qty", ddlEnglishTea.SelectedValue);
                    sqlcmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
                    sqlcmd.Parameters.AddWithValue("@UserCompany", txtCompanyName.Text);

                    sqlcmd.ExecuteNonQuery();
            }

            using (SqlCommand sqlcmd1 = new SqlCommand(insertCommand, conn))
            {
                // sqlcmd.Parameters.AddWithValue("@DrinkName", lblCoffee.Text);
                sqlcmd1.Parameters.AddWithValue("@DrinkName", lblEnglishTea.Text);
                sqlcmd1.Parameters.AddWithValue("@DateOfOrder", DateTime.Today);
                // sqlcmd.Parameters.AddWithValue("@Qty", ddlCoffee.SelectedValue);
                sqlcmd1.Parameters.AddWithValue("@Qty", ddlEnglishTea.SelectedValue);
                sqlcmd1.Parameters.AddWithValue("@UserName", txtUserName.Text);
                sqlcmd1.Parameters.AddWithValue("@UserCompany", txtCompanyName.Text);

                sqlcmd1.ExecuteNonQuery();
            }
        }
    }

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

У вас ошибка, потому что вы дважды объявили параметр Sql с одним и тем же именем:

sqlcmd.Parameters.AddWithValue("@Qty", ddlCoffee.SelectedValue);
sqlcmd.Parameters.AddWithValue("@DrinkName", lblEnglishTea.Text);

попробуйте, как показано ниже:

protected void BtnSubmit_Click(object sender, EventArgs e) 
{
 string connString = "sql database";
 string insertCommand = "INSERT INTO tbDrinks ( DrinkName, DateOfOrder, Qty, UserName, UserCompany) " +
  "values(@DrinkName, @DateOfOrder, @Qty, @UserName, @UserCompany)"; //for testing purpose

 using(SqlConnection conn = new SqlConnection(connString)) 
 {
  conn.Open();
  using(SqlCommand sqlcmd = new SqlCommand(insertCommand, conn)) {

   sqlcmd.Parameters.AddWithValue("@DrinkName", lblCoffee.Text);
   // sqlcmd.Parameters.AddWithValue("@DrinkName", lblEnglishTea.Text);
   sqlcmd.Parameters.AddWithValue("@DateOfOrder", DateTime.Today);
   sqlcmd.Parameters.AddWithValue("@Qty", ddlCoffee.SelectedValue);
   // sqlcmd.Parameters.AddWithValue("@Qty", ddlEnglishTea.SelectedValue);
   sqlcmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
   sqlcmd.Parameters.AddWithValue("@UserCompany", txtCompanyName.Text);
   sqlcmd.ExecuteNonQuery();
  }
 }
}
1 голос
/ 08 ноября 2019

Если вы хотите упростить код для сохранения двух разных покупок и облегчения обслуживания,
создайте класс, который будет вставлять запись на основе заданных аргументов и повторно использовать этот класс для добавления нескольких строк.
C # is objectориентированный язык, поэтому мы можем извлечь из этого пользу.

// Represents data which can be different for different drinks
public class DrinkSelection
{
    public string Name { get; set; }
    public int Qty { get; set; }
}

public class DrinkPurchase
{
    private readonly string _userName;
    private readonly string _userCompany;

    public DrinkPurchase(string userName, string userCompany)
    {
        _userName = userName;
        _userCompany = userCompany;
    }

    public void Save(DrinkSelection drink)
    {
        var insert = @"
            INSERT INTO tbDrinks (DrinkName, DateOfOrder, Qty, UserName, UserCompany)
            VALUES (@DrinkName, @DateOfOrder, @Qty, @UserName, @UserCompany)
        ";

        var parameters = new[]
        {
          new SqlParameter("@DrinkName", SqlDbType.Varchar) { Value = drink.Name },
          new SqlParameter("@DateOfOrder", SqlDbType.DateTime) { Value = DateTime.Today },
          new SqlParameter("@Qty", SqlDbType.Varchar) { Value = drink.Qty },
          new SqlParameter("@UserName", SqlDbType.Varchar) { Value = _userName },
          new SqlParameter("@UserCompany", SqlDbType.Varchar) { Value = _userCompany }
        };

        using (var connection = new SqlConnection(connectionString)) 
        using (var command = connection.CreateCommand())
        {
            command.CommandText = insert;
            command.Parameters.AddRange(parameters);

            connection.Open();
            command.ExecuteNonQuery();
        }
    }
}

Использование

protected void BtnSubmit_Click(object sender, EventArgs e)
{
    var purchase = new DrinkPurchase(txtUserName.Text, txtCompanyName.Text);

    var coffee = new DrinkSelection 
    { 
        Name = lblCoffee.Text, 
        Qty = ddlCoffee.SelectedValue 
    };
    var tea = new DrinkSelection 
    { 
        Name = lblEnglishTea.Text, 
        Qty = ddlEnglishTea.SelectedValue 
    };

    purchase.Save(coffee);
    purchase.Save(tea);
}

Извлекая логику в выделенный класс, вы платите бизнес-логику из зависимостей от веб-фреймворка.

1 голос
/ 08 ноября 2019

Сначала вы добавляете одинаковые параметры дважды. Это необходимо исправить, обновив значение этого конкретного параметра.

Во-вторых, вместо создания двух экземпляров SqlCommand, вы можете просто обновить значение параметра для второй вставки и запустить ExecuteNonQuery () во второй раз. с обновленным значением. Вы можете сделать это так:

 protected void BtnSubmit_Click (object sender, EventArgs e) {
     string connString = "Data Source";
     string insertCommand = "INSERT INTO tbDrinks ( DrinkName, DateOfOrder, Qty, UserName, UserCompany) " +
         "values(@DrinkName, @DateOfOrder, @Qty, @UserName, @UserCompany)";

     using (SqlConnection conn = new SqlConnection (connString)) {
         conn.Open();
         using (SqlCommand sqlcmd = new SqlCommand (insertCommand, conn)) {

             sqlcmd.Parameters.AddWithValue("@DrinkName", lblCoffee.Text);
             sqlcmd.Parameters.AddWithValue("@DateOfOrder", DateTime.Today);
             sqlcmd.Parameters.AddWithValue("@Qty", ddlCoffee.SelectedValue);
             sqlcmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
             sqlcmd.Parameters.AddWithValue("@UserCompany", txtCompanyName.Text);
             sqlcmd.ExecuteNonQuery();

             // update the values and insert with updated values.   
             sqlcmd.Parameters["@DrinkName"].Value = lblEnglishTea.Text; 
             sqlcmd.Parameters["@Qty"].Value = ddlEnglishTea.SelectedValue;
             sqlcmd.ExecuteNonQuery();

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