C I'm not Sharp Ответов: 3

Как исправить: преобразование не удалось при преобразовании значения nvarchar 'hex mec' в тип данных int.


Проблема возникает, когда я запускаю страницу, даже если я не получаю никаких ошибок на .cs.
'Hex Mec' - это первое имя компании из таблицы поставщиков с типом данных varchar (даже если ошибка говорит "преобразование значения nvarchar". Я пытаюсь заполнить одну из них Asp.net выпадающий список основан на выборе в другом выпадающем списке, взятом из этой ссылки

У меня есть много трассировки стека, где исходная ошибка инструктирует меня отслеживать.
Я также делаю коды с использованием datasettableadapters и приветствую любое предложение (умоляющее, потому что это тезис, над которым я работаю).

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

Я не очень хороший программист и хотел бы обратиться за помощью самым простым способом. Я пробовал использовать parse, но ничего не работает (жирные символы там, где я думаю, что это не работает). Я пытаюсь заполнить одну из них Asp.net выпадающий список основан на выборе в другом выпадающем списке и мой код таков:

protected void ddSuppliers_SelectedIndexChanged(object sender, EventArgs e)
    {
        int SupplierID = Convert.ToInt32(ddSuppliers.SelectedValue);
        SqlConnection con = new SqlConnection(connString);
        con.Open();
        SqlCommand cmd = new SqlCommand("SELECT * FROM [dbo].[RawMaterialMF] WHERE SupplierID=@SupplierID", con);
        cmd.Parameters.Add("@SupplierID", SqlDbType.Int).Value = SupplierID;

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        con.Close();
ddRawMats.DataTextField = "ItemName";
        ddRawMats.DataValueField = "ItemName"; 
        ddRawMats.DataBind();
        ddRawMats.Items.Insert(0, new ListItem("Select Raw Materials", "0"));


где этот выпадающий список также появляется в:
protected void btnProceed_Click(object sender, EventArgs e)
    {
        ddSuppliers.Enabled = false;
        mvPDetails.ActiveViewIndex = 0;

        //getting ItemID using the ItemName from the dropdown list
        DataSetTableAdapters.PurchaseDetailsTableAdapter datItem = new DataSetTableAdapters.PurchaseDetailsTableAdapter();
        DataTable tblPurchase = new DataTable();
        tblPurchase = datItem.GetDataByItem(ddRawMats.Text);
        int Item = Convert.ToInt32(tblPurchase.Rows[0]["ItemID"].ToString());

        //getting SupplierID
        DataSetTableAdapters.PurchaseDetailsTableAdapter datSuppliers = new DataSetTableAdapters.PurchaseDetailsTableAdapter();
        DataTable tblSuppliers = new DataTable();
        tblSuppliers = datSuppliers.GetDataBySupplier(ddSuppliers.SelectedValue);
        int Supplier = Convert.ToInt32(tblSuppliers.Rows[0]["SupplierID"].ToString());

        //getting Price using the ItemName from the dropdown
        DataSetTableAdapters.RawMaterialMF1TableAdapter datPrice = new DataSetTableAdapters.RawMaterialMF1TableAdapter();
        DataTable tblPrice = new DataTable();
        tblPrice = datPrice.GetDataByPrice(Item);
        int Price = Convert.ToInt32(tblPrice.Rows[0]["Price"]);
        int total = Price * Convert.ToInt32(txtQty.Text.ToString());

        double qty;
        qty = Convert.ToDouble(txtQty.Text);

        //
        DataSetTableAdapters.PurchaseDetailsTableAdapter datInsert = new DataSetTableAdapters.PurchaseDetailsTableAdapter();
        datInsert.InsertPDetails(null, Item, qty, total, txtRemarks.Text, Supplier);


        gvPurchase.DataBind();
    }

3 Ответов

Рейтинг:
1

Richard MacCutchan

Какое именно значение вы ожидаете получить, пытаясь преобразовать "Hex Mec" в целое число? Очевидно, что компьютер не может сделать никаких предположений относительно того, что вы хотите.


C I'm not Sharp

Это ID, int. Это из выпадающего списка с источником данных, который показывает список имен компаний в таблице поставщиков, но я не знаю, почему и какой код получает "Hex Mec" только тогда, когда он должен получать все имена компаний.

Richard MacCutchan

Вы не можете преобразовать строку буквенных символов в целое число. Тоже в строю:
int Supplier = Convert.ToInt32(tblSuppliers.Rows[0]["SupplierID"].ToString()); и если предположить, что элемент SupplierId является целым числом, то почему вы преобразуете его в строку только для того, чтобы можно было преобразовать его обратно в целое число?

Рейтинг:
1

OriginalGriff

Если предполагается, что ваш столбец является целочисленным полем идентификатора, то почему вы преобразуете его в строку, чтобы преобразовать обратно в целое число?
И если это не целое число - а это не так, если данные в вашей таблице "hex mec", - то, вероятно, так и должно быть, поэтому подобных проблем не возникает.

Мы не можем сказать "сделай это" и устранить проблему - она слишком тесно связана с вашими данными и источником данных, ни к одному из которых у нас нет доступа.
Так что все будет зависеть от тебя.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


C I'm not Sharp

Я попробовал поставить точку останова, но она не работает. Даже если я удаляю ToString, ошибка все равно остается той же. Как вы думаете, проблема в коде или моем sql?

OriginalGriff

Он жалуется на NVARCHAR - что означает, что это как-то связано с базой данных.
В чем именно заключается проблема - и пока вы не найдете точно, на что жалуется код (а я не думаю, что это тот код, который вы показываете), вы не узнаете, что именно.
Если вы запускаете свое приложение в отладчике, то исключение должно быть поймано отладчиком, если только ваш код не захватывает его сам с помощью блока try...catch. Вы можете переопределить try...catch в отладчике с помощью кнопки "Debug...Исключения" меню и галочки все в графе "выброшено".
Когда отладчик ловит исключение, он останавливается на строке, и вы можете посмотреть, что именно вызывает проблему (или, по крайней мере, то, что вы попросили SQL yo сделать, что могло бы указать, где в вашей БД данные терпят неудачу.)

C I'm not Sharp

Я не использую try and catch во всей странице .cs, которая оставляет меня на что-то в базе данных. В любом случае, спасибо, я постараюсь еще раз поэкспериментировать с этим

Рейтинг:
1

phil.o

Мы не можем видеть, как вы заполняете свой выпадающий список.
Как правило, в раскрывающихся списках, привязанных к таблице, требуется две информации: ключ, представляющий выбранное значение (ключ, поскольку он должен позволять однозначно извлекать определенную строку в таблице), и текст, используемый для отображения выбранного значения. Эта информация контролируется с помощью DataValueField и DataTextField свойства, соответственно. Таким образом, когда вы выбираете "Hex Mec" в списке, значение, возвращаемое SelectedValue свойство-это первичный ключ элемента в таблице базы данных.
Вы можете увидеть больше на DropDownList использование на его справочной странице:
Класс DropDownList[^]
Любезно.


C I'm not Sharp

Вот что находится на моей странице aspx.
&ЛТ;как ASP:dropdownlist с ИД="ddSuppliers" атрибут runat="сервер" ширина="100%" CssClass="форма контроля" свойстве datasourceid="SqlDataSourceSuppliers" DataTextField="название организации" DataValueField="название организации" autopostback элемента управления="истинный" OnSelectedIndexChanged="ddSuppliers_SelectedIndexChanged"&ГТ;


&ЛТ;как ASP:sqldatasource его атрибут runat="сервер" идентификатор="SqlDataSourceSuppliers" свойства connectionString='&л;%$ connectionstrings в:CECnewConnectionString %&ГТ;' команды selectcommand="выбрать [название организации], [столбцов supplierid] от поставщика"и GT;

У меня не было возможности выбрать что-либо, потому что, во-первых, он направляет меня на страницу ошибки. Т

phil.o

Возможно:

<asp:DropDownList ID="ddSuppliers" runat="server" Width="100%" CssClass="form-control" DataSourceID="SqlDataSourceSuppliers" DataTextField="CompanyName" DataValueField="SupplierID" AutoPostBack="True" OnSelectedIndexChanged="ddSuppliers_SelectedIndexChanged">