Member 14108087 Ответов: 2

Как решить проблему сбоя преобразования при преобразовании значения varchar в тип данных int VB.NET-что?


Я использую базу данных sql и элемент управления datagridview в vb.net форма для отображения данных из БД. У меня есть текстовое поле и кнопка поиска, при нажатии на которую продукт с этим именем[Product Name] В sql типа nvarchar(MAX) или код[Product Code] в sql типа int ищется и отображается в datagridview. Когда я ввожу [код продукта] в текстовое поле, он отображает продукт правильно, но когда я ввожу [Product Name] оператор select, который я использую, таков
USE [Sales And Inventory] SELECT [Product Code],[Product Name],[Price],[Discount],[VAT],[Quantity] FROM [dbo].[PRODUCTS] WHERE  [Product Code]=@d1 or [Product Name] = @d2

Я получаю эту ошибку
'conversion failed when converting the varchar value to datatype int vb.net

Интересно то, что когда я удаляю либо то, либо другое [Product Code] или [Product Name] в whereи это прекрасно работает.
Но я хочу, чтобы кнопка поиска выполняла поиск и фильтрацию записей при вводе кода продукта или использования продукта или инструкции.


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

If TextBox1.Text = Nothing Then
            MessageBox.Show("Please enter product to search.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        Else
            Try
                Using con As New SqlConnection(cs)
                    con.Open()


                    cmd = New SqlCommand("USE [Sales And Inventory] SELECT [Product Code],[Product Name],[Price],[Discount],[VAT],[Quantity] FROM [dbo].[PRODUCTS] WHERE  [Product Code]=@d1 or [Product Name] = @d2", con)
                    cmd.Parameters.AddWithValue("@d1", TextBox1.Text)
                    cmd.Parameters.Add("@d2", SqlDbType.NVarChar).Value = TextBox1.Text
                    rdr = cmd.ExecuteReader
                    productdatagridview.Rows.Clear()
                    If rdr.HasRows Then
                        While rdr.Read
                            productdatagridview.Rows.Add(rdr(0), rdr(1), FormatCurrency(rdr(2)), String.Format("{0:n}", rdr(3)), String.Format("{0:n}", rdr(4)), CInt(rdr(5)).ToString("###,###"))
                        End While
                    Else
                        MessageBox.Show("Product Not Found. Please try again.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                        Button4.PerformClick()
                    End If
                    con.Close()
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If

2 Ответов

Рейтинг:
2

RmcbainTheThird

Вам нужно использовать два разных текстовых поля для ввода кода и/или имени. И в зависимости от того, какое текстовое поле они заполнили, вы построите свое предложение where и параметр, чтобы соответствовать ему. Ваше предложение where будет [Product Code]=@d1, если они заполнили текстовое поле для кода. Если они заполнили текстовое поле имя, то это будет [название продукта] = @d1.

Вам придется использовать ту же логику для определения объекта параметра.


Member 14108087

Я не хочу использовать два текстовых поля мне нужно одно где пользователь может ввести либо название продукта либо код продукта и datagridview отобразит найденные записи

RmcbainTheThird

В этом случае вам нужно будет посмотреть, что они вводят, и если это число, то ваше предложение where будет [код продукта]=@d1, а если они вводят текст, то предложение where будет [название продукта] = @d1. Вам нужно будет использовать ту же логику, чтобы решить, как объявить свой параметр. Но у вас не будет предложения where С или в нем.

Рейтинг:
2

MadMyche

Похоже, проблема в том, что либо @d1 или @d2 из INTтип данных eger в таблице на вашем DB. Judign, который название продукта похоже, что это текстовое описание, я предполагаю, что столбец данных [код продукта] будет числовым идентификатором, поэтому параметр @d1 будет целым числом.

Вероятно, самый простой способ проверить это-проверить схему таблицы, а второе, что нужно проверить, - это значение Текстовое поле textbox1.Текст Изменение кодирования, чтобы попробовать, если вы хотите пропустить правильные методы, было бы шлепнуть простой метод преобразования на предполагаемое целочисленное значение, чтобы оно не входило в виде строки.

' cmd.Parameters.AddWithValue("@d1", TextBox1.Text)
cmd.Parameters.AddWithValue("@d1", CInt(TextBox1.Text))


Member 14108087

Спасибо. в моем sqldb код продукта имеет тип int и название продукта типа nvarchar(MAX). Я хочу, чтобы он работал так же, как в sql.. вот пример.....
в sql используется такая логика...
приведенный ниже код хорошо работает в среде sql server management studio, но в vb.net windows forms этого не делает. Почему это так?
выберите * из продуктов, где код продукта = 522 или название продукта = 'яйцо'

MadMyche

То Параметры.AddWithValue() метод будет "автоматически вводить" значение, добавляемое включенной переменной; и как Текстовое поле textbox1.Текст возвращает строку, то добавленный параметр будет иметь тип символьной строки

Member 14108087

если бы RDR.hasrows присвоено значение "false". Я набираю правильное название продукта в текстовом поле, поэтому я уверен, что продукт с этим названием существует в БД. Извините, если это займет слишком много времени и отнимет ваше время. Заранее спасибо