Member 13954123 Ответов: 3

Hresult=0x80131515 значение параметра


Привет,

Я работаю в приложении в VB.NET-да. Я застрял в этой ошибке:

Система.исключение NotSupportedException
HResult=0x80131515
Message=идентификатор клиента-члена типа BillTimeLibrary.BillTimeLibrary.Модели.ClientModel не может использоваться в качестве значения параметра


Контекстуализация...
Во-первых, у меня есть такое же приложение, работающее на C#. Я превращаюсь в VB.NET чтобы узнать и понять, как использовать базу данных SQLite с Dapper с этими обоими языками.

Ошибка появляется при передаче параметра из подпрограммы, которая соединяет две таблицы из моей базы данных.
Таблица платежей имеет ключ Foreing с именем ClientId, который определяет, от какого клиента происходит платеж. В окне платежей у меня есть выпадающий список, где я выбираю клиента, и если есть какой-либо платеж, то даты платежей перечислены в другом выпадающем списке.
Этот запрос не работает, когда я выбираю клиента, программа должна получать платежи в планшетных платежах по ClientId, но она выдает ту ошибку, о которой я упоминал выше.
Подпрограмма, которая должна передавать параметры для запроса, является:

Private Sub LoadDateDropDown()
        Dim sql As String = "select * from Payment where ClientId = @ClientId"
        Dim parameters As Dictionary(Of String, Object) = New Dictionary(Of String, Object) From {
                {"@ClientId", ClientDropDown.SelectedValue}
            }
        Dim records = SQLiteDataAccess.LoadData(Of PaymentsModel)(sql, parameters)
        payments.Clear()
        records.ForEach(Sub(x) payments.Add(x))
    End Sub


сообщение просматривается в подгруппе Load, которая получает параметры.


Параметр, упомянутый в сообщении, создается в модели: он имеет тот же тип переменной, что и таблица базы данных.

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks


Namespace BillTimeLibrary.Models
    Public Class PaymentsModel
        Public Property Id As Integer
        Public Property ClientId As Integer
        Public Property Hours As Double
        Public Property Amount As Double
        Public Property DatePayment As String
    End Class
End Namespace



Я думаю, что я может быть использование неправильного имущество ClientDropDown (мой комбобокс)

Смотрите исходный код на языке Си#:


private void LoadDateDropDown()
        {
            string sql = "select * from Payment where ClientId = @ClientId";

        Dictionary<string, object> parameters = new Dictionary<string, object>
        {
            { "@ClientId", ClientDropDown.SelectedValue }
        };

        var records = SQLiteDataAccess.LoadData<PaymentsModel>(sql, parameters);

        payments.Clear();
        records.ForEach(x => payments.Add(x));
    }


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

Я пытаюсь понять, как получить доступ к таблице платежей через поле ClientId. Пока безрезультатно.

Это полная информация об ошибке.. кажется, что-то с Dapper. Но так как я новичок в этом деле, то пока не знаю, как его решить.

Система.исключение NotSupportedException
HResult=0x80131515
Message=идентификатор клиента-члена типа BillTimeLibrary.BillTimeLibrary.Модели.ClientModel не может использоваться в качестве значения параметра
Источник=Щеголеватый
Трассировка стека:
в Dapper.SqlMapper.LookupDbType(Type type, String name, Boolean demand, ITypeHandler& handler) в C:\projects\dapper\Dapper\SqlMapper.cs:line 417
в Dapper.Динамические параметры.AddParameters(IDbCommand command, Identity identity) in C:\projects\dapper\Dapper\DynamicParameters.cs:line 238
в Dapper.Динамические параметры.Щеголеватый.SqlMapper.IDynamicParameters.AddParameters(IDbCommand command, Identity identity) in C:\projects\dapper\Dapper\DynamicParameters.cs:line 156
в Dapper.SqlMapper.&ЛТ;&ГТ;с__DisplayClass161_0.&ЛТ;getcacheinfo&ГТ;б__0 (, объект IDbCommand УМК объект) в C:\projects\dapper\Dapper\SqlMapper.cs:line 1694
в Dapper.CommandDefinition.SetupCommand(IDbConnection cnn, Action`2 paramReader) in C:\projects\dapper\Dapper\CommandDefinition.cs:line 128
в Dapper.SqlMapper.<queryimpl>d__138`1.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.cs:line 1075 г.
в системе.Коллекции.Generic.List`1..ctor(IEnumerable`1 коллекция)
в System.Linq.Перечислимый.ToList[TSource](IEnumerable`1 source)
в Dapper.SqlMapper.Запрос[Т](интерфейс idbconnection CNN, в строку SQL, объектно парам, сделки IDbTransaction, логическое буферизацией, допускающий значение null,`1 commandTimeout, допускающий значение null,`1 свойство commandtype) в C:\projects\dapper\Dapper\SqlMapper.cs:line 723
в Биллтимелибрарии.SQLiteDataAccess.LoadData[T](String sqlStatement, Dictionary`2 parameters, String connectionName) in C:\BillTime_VB\BillTimeLibrary\DataAccess\SQLiteDataAccess.vb:line 25
в BillTime_VB.Платежи.LoadDateDropDown() in C:\BillTime_VB\BillTime_VB\Controls\Payments.vb:line 141
в BillTime_VB.Платежи.ClientDropDown_SelectedIndexChanged(отправитель объекта, EventArgs e) in C:\BillTime_VB\BillTime_VB\Controls\Payments.vb:line 133
в системе.Окна.Формы.комбинированный список.OnSelectedIndexChanged(EventArgs e)
в системе.Окна.Формы.ComboBox.set_SelectedIndex(значение Int32)
в системе.Окна.Формы.комбинированный список.RefreshItems()
в системе.Окна.Формы.комбинированный список.OnDataSourceChanged(EventArgs e)
в системе.Окна.Формы.Элементе управления listcontrol.SetDataConnection(Object newDataSource, BindingMemberInfo newDisplayMember, Boolean force)
в системе.Окна.Формы.Элементе управления listcontrol.set_DataSource(объектное значение)

Dave Kreskowiak

Мы не могли бы сказать вам, как проблема лежит в/за SQLiteDataAccess. Это не обычный тип, так что это должно быть что-то в вашем коде где-то.

3 Ответов

Рейтинг:
0

Gerry Schmitz

Что такое "тип" ClientId?

Судя по всему, вы хотите загрузить "PaymentsModel", используя "ClientId" из "ClientModel".

Кажется, совершенно ясно, что ему не нравится "тип", который вы проходите.


Member 13954123

Это целое число

Richard Deeming

Не в соответствии с сообщением об ошибке:
"Член ClientId типа BillTimeLibrary.BillTimeLibrary.Модели.ClientModel ...

Рейтинг:
0

raddevus

Пара подсказок, которые могут помочь:

1) Погуглите ошибку : HResult=0x80131515, и вы обнаружите, что она приводит вас к ошибке : "не удалось загрузить файл или сборку". Конечно, возникает вопрос, почему он не может загрузить файл или сборку?

2) Очень внимательно посмотрите на две строки из вашего источника-ошибка на самом деле указывает на них как на первоначальную причину:

1. Controls\Payments.vb:строка 133
2. Controls\Payments.vb:строка 141

Разместите эти две строки здесь, и я, возможно, смогу помочь вам больше.


Member 13954123

Я скопировал весь блок, который включает в себя эти две строки.

127 Private Sub ClientDropDown_SelectedIndexChanged(sender As Object, e As EventArgs) обрабатывает ClientDropDown.Разделе мы рассмотрим
128 Label2.Visible = True
129 dateDropDown.Visible = True
130 OrTextBox.Visible = True
131 newButton.Видимое = Истинное
132
133 LoadDateDropDown()
134 Конец Подпрограммы
135
136 Private Sub LoadDateDropDown()
137
138 Dim sql As String = "select * from Payment where ClientId = @ClientId"
139 Дим параметров в словарь(строка, объект) = новый словарь(строки, объекта) из {
140 {"@ClientId", ClientDropDown.ValueMember}'SelectedValue}
141 }
142
143 Dim records = SQLiteDataAccess.LoadData(of PaymentsModel)(sql, параметры)
144 платежи.Четкий()
145 записей.По каждому элементу(подпункт(х) платежи.Добавить(х))
146 Конец Подпрограммы

Member 13954123

платежи объявляются в начале кода как

Частная выплаты в коллекции ObservableCollection(из PaymentsModel) = новая коллекция ObservableCollection(из PaymentsModel)()

Рейтинг:
0

raddevus

Пара подсказок, которые могут помочь:

1) Погуглите ошибку : HResult=0x80131515, и вы обнаружите, что она приводит вас к ошибке : "не удалось загрузить файл или сборку". Конечно, возникает вопрос, почему он не может загрузить файл или сборку?

2) Очень внимательно посмотрите на две строки из вашего источника-ошибка на самом деле указывает на них как на первоначальную причину:

1. Controls\Payments.vb:строка 133
2. Controls\Payments.vb:строка 141

Разместите эти две строки здесь, и я, возможно, смогу помочь вам больше.

3) Я также замечаю, что ошибка гласит::
Член ClientId типа BillTimeLibrary.BillTimeLibrary.Модели.ClientModel не может использоваться в качестве значения параметра.

Но вы показали нам класс :
Биллтимелибрари.Модели
открытый класс PaymentsModel

Интересно, если вы ссылаетесь на значение в неправильном типе??


Member 13954123

Мне это тоже показалось странным. Это может быть проблемой. Переменная ClientID находится в PaymentModel. Я это проверю.

raddevus

Трудно определить, что происходит. Но у меня есть два предложения (может быть, вы уже пробовали их?).
1) Замените SelectedValue жестко закодированным значением (возможно, вы знаете, что оно допустимо) и попробуйте запустить его.
change => { "@ClientId", ClientDropDown.SelectedValue }
to => { "@ClientId", 5 }

2) Запустите в режиме отладки шаг в LoadDateDropDown и нажмите F11 на каждой строке (шаг в), чтобы точно определить, где код терпит неудачу.

Member 13954123

На самом деле я не пробовал эти варианты до того, как прочитал ваш комментарий.

Did (1), и он работает при передаче числа вместо "ClientDropDown.SelectedValue".

В (2) код завершается ошибкой в строке 25 моего класса SQLiteDataAccess, которая является строкой, использующей переданные параметры (@ClientId, Value) для доступа к базе данных. Идентификатор не передается правильно из выпадающего списка.


10Public класс SQLiteDataAccess
11 'общий код для загрузки данных
12 'метод loadData&ЛТ;personmodel&ГТ;("выбрать * из человека", значение null) = список<personmodel&ГТ;
13 общедоступный метод loadData функция(Т)(метода sqlstatement бывал как String, byval параметры в словарь(строка, объект), бывал Факультативного параметра connectionname как String = "по умолчанию") Как Список(Из Т)
14
15 Дим P как динамические параметры = новый динамические параметры()
16 'DynamicPirameters-это щеголеватый тип
17
18 для каждого параметра в параметрах
19 '@FirstName, "Тим"
20 р. добавить(парам.Ключ, парам.значение)
21 далее
22
23
24 использование Си-эн-эн интерфейс idbconnection = новый SQLiteConnection(DataAccessHelpers.LoadConnectionString(имя соединения))
25 тусклых строк = cnn.Query(Of T)(sqlStatement, p)
26 возвратных строк.Список()
27 Конец Через
28
29 Конечная Функция
30

Member 13954123

Я не понимаю, почему сообщение об ошибке относится к CLientModel. Код, кажется, относится к PaymentModel, как я смотрю.

raddevus

Поскольку он работает с жестко закодированным значением идентификатора (известным целым числом), то проблема, вероятно, заключается в том, как это значение извлекается из droplist. Правильно ли вы установили DisplayMember и ValueMember droplist (combobox или что-то еще)?
Например о том что я имею в виду см.:
https://stackoverflow.com/questions/9521980/combobox-valuemember-and-displaymember

Member 13954123

Я так думаю. Я подал точно такой же пример, как и вы.

dateDropDown.Источник данных = выплатами '.Что ItemsSource = платежи
dateDropDown.DisplayMember = "DatePayment" '.DisplayMemberPath = "дата"
dateDropDown.ValueMember = "Идентификатор"

Но я также установил клиентский combobox в:
ClientDropDown.ItemsSource = клиенты
ClientDropDown.DisplayMemberPath = "Имя"
ClientDropDown.SelectedValuePath = "Id"

Может быть, это и есть причина?

raddevus

Да, я думаю, что причина именно в этом. Но у меня не так много информации, чтобы помочь вам это исправить.
Это приложение WPF? Я думал, что это WinForms.
Если это WPF, то здесь, в CP, есть очень хорошее объяснение этой привязки данных, как вы пытаетесь: https://www.codeproject.com/Articles/671544/Understanding-SelectedValue-SelectedValuePath-Sele

она короткая и может помочь.

Member 13954123

Это приложение WindowsForm.


Возможно, я допустил некоторые ошибки, потому что оригинал приложения (c#) я упомянул это в WPF, и мое заявление VB.NET это WinForm. Я был немного смущен тем, какие свойства имеют одинаковое значение в WinForm, так как нет точно таких же имен.

raddevus

Да, поскольку это приложение winform, попробуйте использовать только свойства DataSource, DisplayMember и ValueMember в этом clientDropDown, и тогда оно может работать-в зависимости от ряда других вещей. это может быть немного сложно сделать это правильно.