автоинкрементный первичный ключ n ввод данных из внешнего интерфейса, который является веб-страницей

Я создал таблицу и автоматически увеличил столбец первичного ключа. Я создал веб-форму на С# на платформе .NET, которая размещена локально. У меня проблема, когда я пытаюсь ввести данные из веб-формы, столбец первичного ключа не заполняется автоматически, когда я заполняю другие поля, он не принимает никакого значения, которое я ввожу.

  1. когда я ввожу значение самостоятельно, он говорит: «Невозможно вставить явное значение для столбца идентификаторов в таблице «Продукт», когда для параметра IDENTITY_INSERT установлено значение OFF».

  2. #P3#
    #P4# #P5# #P6# #P7# #P8# #P9#

Поскольку я автоматически увеличил его, я хочу получить значение автоматически, пока я заполняю другие столбцы, но этого не происходит. Что я делаю?


person Akshay Saxena    schedule 10.07.2012    source источник
comment
пожалуйста, просмотрите мои правки к вашему вопросу, я прибрался, как мог, я не думаю, что удалил что-то важное, но в вашем блоке кода была плавающая " под строкой Line 45:.   -  person David says reinstate Monica    schedule 10.07.2012
comment
Рассмотрите возможность использования параметризованных запросов или хранимых процедур или, по крайней мере, используйте «string.format», например. string.Format(INSERT INTO Table VALUES ({0}, '{1}', {2}), 1, некоторое значение, 55); Это намного читабельнее   -  person Charleh    schedule 10.07.2012


Ответы (1)


вы можете изменить свою команду.

objCommand.CommandText = "INSERT INTO Product " +
   "(CustomerName,CustomerAddress,InvoiceNumber,InvoiceDate,ProductName,"+  
   "ProductDescription,UnitCost,Quantity,TotalAmountToBePaid) VALUES " + 
   "(@cname, @caddress, @inumber, @idate, @pname, @pdesc, @unitcost, @qty, @total); " +
   "SELECT SCOPE_IDENITY();";

objCommand.Parameters.Add(new SqlParameter("@cname", tbcustomername.Text));
objCommand.Parameters.Add(new SqlParameter("@caddress", tbcustomeraddress.Text));
objCommand.Parameters.Add(new SqlParameter("@inumber", int.Parse(tbinvoicenumber.Text)));
objCommand.Parameters.Add(new SqlParameter("@idate", DateTime.Parse(tbinvoicedate.Text)));
objCommand.Parameters.Add(new SqlParameter("@pname", tbproductname.Text));
objCommand.Parameters.Add(new SqlParameter("@pdesc", tbproductdescription.Text));
objCommand.Parameters.Add(new SqlParameter("@unitcost", decimal.Parse(tbunitcost.Text)));
objCommand.Parameters.Add(new SqlParameter("@qty", int.Parse(tbquantity.Text)));
objCommand.Parameters.Add(new SqlParameter("@total", decimal.Parse(tbamounttobepaid.Text)));

int id = (int)objCommand.ExecuteScalar(); 

Это вернет последнюю идентификацию, вставленную в эту транзакцию, к которой вы хотите получить доступ. Полезно помнить, что вы можете отправить несколько операторов в одной команде.

И, как говорит @Wiktor_Zychla в комментарии ниже, лучше использовать параметры в ваших запросах, чтобы избежать инъекции sql.

person Arturo Martinez    schedule 10.07.2012
comment
Поскольку мы здесь не только для того, чтобы помогать друг другу, но и для продвижения лучшего кодирования, рассмотрите возможность редактирования ответа, чтобы использовать параметризованный запрос. - person Wiktor Zychla; 10.07.2012