faizy001 Ответов: 3

Невозможно вставить десятичную дробь


я не могу вставить десятичное значение в c# с помощью .net framework.
каждый раз, когда эти ошибки приходят


An unhandled exception of type 'System.InvalidCastException' occurred in mscorlib.dll

Additional information: Unable to cast object of type 'System.Data.SqlClient.SqlParameter' to type 'System.IConvertible'.


стол
CREATE TABLE [dbo].[itemmaster]
(
	[itemcode] [varchar](33) NULL,
	[name] [varchar](50) NULL,
	[salesprice] [decimal](18, 2) NULL,
	[salestax] [decimal](18, 2) NULL,
	[profit] [decimal](18, 2) NULL,
	[quantityonhand] [decimal](18, 2) NULL
) ON [PRIMARY]


Что я уже пробовал:

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=DelhiEMP;Integrated Security=True");
            SqlCommand cmd = new SqlCommand("insert into itemmaster(itemcode,name) values(@itemcode,@name)", con);
            con.Open();
            itemmaster itemmastr = new itemmaster();
            itemmastr.itemcode = Convert.ToString(cmd.Parameters.AddWithValue("@itemcode", txtitemcode.Text.Trim()));
            itemmastr.name = Convert.ToString(cmd.Parameters.AddWithValue("@name", txtname.Text.Trim()));
            itemmastr.salesprice = Convert.ToDecimal(cmd.Parameters.AddWithValue("@salesprice", txtsaleprice.Text));
            
           
            SqlDataAdapter da = new SqlDataAdapter(cmd);  
            DataSet ds = new DataSet();
            da.Fill(ds, "itemmaster");
            dataGridView1.DataSource = null;

Maciej Los

Чего вы пытаетесь достичь?

3 Ответов

Рейтинг:
2

Robert Welliever

Процедуры Void не возвращают значения. Вы пытаетесь передать несуществующее возвращаемое значение в класс Convert. Ваш командный объект для вставки должен выглядеть примерно так:

using (SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=DelhiEMP;Integrated Security=True")){
                using (SqlCommand command = new SqlCommand("insert into itemmaster(itemcode,name) values(@itemcode,@name)", connection))
                {
                    command.Parameters.AddWithValue("@itemcode", txtitemcode.Text.Trim());
                    command.Parameters.AddWithValue("@name", txtname.Text.Trim());
                    command.Parameters.AddWithValue("@salesprice", txtsaleprice.Text);
                    connection.Open();
                    command.ExecuteNonQuery();
                    connection.Close();
                }
            }


Использование itemmaster привело меня в замешательство относительно того, какова ваша цель. Кроме того, открытие соединения с БД до того, как вы закончите создавать свой командный объект, является неправильным, и присвоение null to to dataGridView1.DataSource не обязательно кажется отличным способом заполнения datagrid.


Рейтинг:
1

OriginalGriff

Пожалуйста, сделайте себе одолжение и посмотрите документацию.
Сначала вы должны преобразовать пользовательский ввод в собственные типы (с обработкой ошибок для сообщения о проблемах пользователю), а затем передать собственные значения в SQL через cmd.Parameters.AddWithValue.

Этот код выглядит так, как будто вы догадались, что поставить, и надеялись на лучшее, а не искали функции (которые включают примеры) и реализовывали их.


Рейтинг:
1

Michael_Davies

Я подозреваю, что добавление параметров в SqlCommand не возвращает добавленную стоимость. Вам было бы лучше преобразовать свои значения в itemmastr, а затем добавить параметры из itemmastr. Также нет необходимости преобразовывать в строку то, что уже является строкой.

Вы также должны быть уверены, что введенные данные являются числом, лучше использовать decimal.tryparse, чтобы сначала проверить и остановить, если это не удастся.

itemmastr.itemcode = txtitemcode.Text.Trim();
itemmastr.name = txtname.Text.Trim();
itemmastr.salesprice = Convert.ToDecimal(txtsaleprice.Text);

cmd.Parameters.AddWithValue("@itemcode", itemmastr.itemcode);
cmd.Parameters.AddWithValue("@name", itemmastr.name);
cmd.Parameters.AddWithValue("@salesprice", itemmastr.salesprice);


Забыл добавить:
Ваша команда insert не включает salesprice, она вставляет только itemcode и name, так что вы все равно получите сбой в строке cmd.parameters для salesprice.


faizy001

спасибо :)