Создание запроса к данным

Форум посвящён работе с базами данных в .NET.

Модератор: Ramzes

matdilon
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.08.2010 (Вт) 23:20

Создание запроса к данным

Сообщение matdilon » 17.08.2010 (Вт) 21:59

Пытаюсь вытащить из базы данных и связать фамилии студентов, их суммы и даты оплаты обучения. Все эти данные нужно свести в ListBox и DataGridView, чтобы при выделении фамилии студента в списке ListBox, высвечивались его сумма оплаты и дата в DataGridView. ошибку выдает только на этапе компиляции. Выводит сообщение, что "Приведение типа "|DataRowView" к типу "String" является недопустимым" и указывает на строчку -
Dim sur As String = ListBox1.Items(ListBox1.SelectedIndex)

Подскажите где здесь проблема?

Превью - http://i8.fastpic.ru/big/2010/0808/3a/3 ... fb473a.jpg
http://depositfiles.com/files/fgwidleqr - база данных

На другой ветке (VB.NET) посоветовали добавить такую концовку к строчке /Dim sur As String = ListBox1.Items(ListBox1.SelectedIndex).ToString/
Но это не решило проблему, выдается такая ошибка - "Ошибка при создании формы. См. Exception.InnerException. Ошибка - несоответствие типа в выражении".

Код: Выделить всё
Imports System.Data.OleDb

Public Class Form1

Private Sub StudentsBindingNavigatorSaveItem_Click(ByVal sender As System.Object,

ByVal e As System.EventArgs) Handles StudentsBindingNavigatorSaveItem.Click Me.Validate()

Me.StudentsBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.ContractsDataSet)

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: данная строка кода позволяет загрузить данные в таблицу "ContractsDataSet.Students".

'При необходимости она может быть перемещена или удалена.
Me.StudentsTableAdapter.Fill(Me.ContractsDataSet.Students)

End Sub

Public Sub Fill_ListBox()
Dim DS As New ContractsDataSet
Dim CN As New OleDb.OleDbConnection

CN.ConnectionString = "Provider=Microsoft.ACE.OleDb.12.0; " &
"Data Source=""E:\DISTR\VisualBasic2010\DataBases\Contracts.accdb"";User ID=Admin"

CN.Open()
If CN.State <> ConnectionState.Open Then MessageBox.Show("Not connected")

Dim quer As String = "SELECT Students.StudSurName FROM Students"

Dim com As New OleDb.OleDbCommand(quer, CN)
Dim read As OleDb.OleDbDataReader = com.ExecuteReader()

While read.Read()
ListBox1.Items.Add(read(0).ToString())
End While

CN.Close()

End Sub

Public Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles ListBox1.SelectedIndexChanged

Dim DS As New ContractsDataSet
Dim CN As New OleDb.OleDbConnection

CN.ConnectionString = "Provider=Microsoft.ACE.OleDb.12.0; " &
"Data Source=""E:\DISTR\VisualBasic2010\DataBases\Contracts.accdb"";User ID=Admin"

CN.Open()
If CN.State <> ConnectionState.Open Then MessageBox.Show("Not connected")

' получение значения выбранного элемента в ListBox
Dim sur As String = ListBox1.Items(ListBox1.SelectedIndex)
Dim quer As String = "SELECT Payments.PaySum, Payments.PayDate FROM Students, " &

"Payments WHERE RefStudent = IDStudent And StudSurName = '" + sur + "'"

Dim com As New OleDb.OleDbCommand(quer, CN)
Dim read As OleDb.OleDbDataReader = com.ExecuteReader()

REM вспомогательная переменная
Dim s1(2) As [String]
REM предварительная очистка DataGridView
DataGridView1.Rows.Clear()

REM заполнение компонента DataGridView
While read.Read()
s1.SetValue(read(0).ToString(), 0)
s1.SetValue(read(1).ToString(), 1)

DataGridView1.Rows.Add(s1)
End While

CN.Close()

End Sub
End Class

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Создание запроса к данным

Сообщение FireFenix » 17.08.2010 (Вт) 22:26

"Приведение типа "|DataRowView" к типу "String" является недопустимым" и указывает на строчку -
Код: Выделить всё
Dim sur As String = ListBox1.Items(ListBox1.SelectedIndex)

ListBox1.Items формально хранит список List(Of Object) => в строке листбокса может содержаться элемент любого типа, неявно приведённый к типу Object
Т.к. заполнюется/изменяются элементы листбокса только в одном месте, то наверняка там что-то типа DataRowView приводится к Object, потом через Dim sur As String = ListBox1.Items(ListBox1.SelectedIndex) приводится к String

Попробуй
Код: Выделить всё
While read.Read()
ListBox1.Items.Add(read.GetString(0))
End While

Вместо
Код: Выделить всё
While read.Read()
ListBox1.Items.Add(read(0).ToString())
End While



P.S. Вместо
Код: Выделить всё
ListBox1.Items(ListBox1.SelectedIndex)

Проще Использовать
Код: Выделить всё
ListBox1.SelectedItеm


Вместо REM можно использовать одинарные кавычки
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

matdilon
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.08.2010 (Вт) 23:20

Re: Создание запроса к данным

Сообщение matdilon » 18.08.2010 (Ср) 12:27

Спасибо за ответ, насколько я понял, прежде у меня было вот так,
Код: Выделить всё
While read.Read()
s1.SetValue(read(0).ToString(), 0)
s1.SetValue(read(1).ToString(), 1)


я поменял на
Код: Выделить всё
While read.Read()
            ListBox1.Items.Add(read.GetString(0))
            ListBox1.Items.Add(read.GetString(1))
        End While


в итоге та же самая ошибка. Не совсем понятно, в каком месте работает дополнительная переменная s1...

А это выражение вроде как не является членом Systems.Windows.Forms.ListBox - /ListBox1.SelectedItеm/. Поэтому заменить не получилось.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Создание запроса к данным

Сообщение FireFenix » 18.08.2010 (Ср) 19:32

Не стал разбираться - что и как не работало, просто исправил чтобы работало... сильно уж кривой код...
Код: Выделить всё
Imports System.Data.OleDb

Public Class Form1
    Private Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0; Data Source=""E:\Contracts.accdb"";User ID=Admin")
    Private DataSet As New DataSet("Payments")

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Connection.Open()

        If Connection.State <> ConnectionState.Open Then
            MessageBox.Show("Not connected")
            Exit Sub
        End If

        Fill_ListBox()

        DataGridView1.Columns.Add("PaySum", "Сумма")
        DataGridView1.Columns.Add("PayDate", "Дата")
    End Sub

    Public Sub Fill_ListBox()
        Dim Command As New OleDb.OleDbCommand("SELECT Students.StudSurName FROM Students", Connection)

        Using Query As OleDb.OleDbDataReader = Command.ExecuteReader()
            If Query.HasRows Then
                While Query.Read()
                    ListBox1.Items.Add(Query.GetString(0))
                End While
            End If
        End Using
    End Sub

    Public Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
        If ListBox1.SelectedItem Is Nothing Or Not TypeOf ListBox1.SelectedItem Is String Then Exit Sub

        Dim Row As Integer = 0
        Dim Name As String = DirectCast(ListBox1.SelectedItem, String)

        ', Students WHERE RefStudent = IDStudent And StudSurName = '" + Name + "';"
        Dim Command As New OleDb.OleDbCommand("SELECT Payments.PaySum, Payments.PayDate FROM Payments;", Connection)

        Using Query As OleDb.OleDbDataReader = Command.ExecuteReader()
            If Query.HasRows Then
                While Query.Read()
                    DataGridView1.Rows.Add()

                    DataGridView1.Rows(Row).Cells(0).Value = Query.GetInt32(0)
                    DataGridView1.Rows(Row).Cells(1).Value = Query.GetDateTime(1)

                    Row += 1
                End While
            End If

        End Using
    End Sub
End Class

Вот этот - работает...
Изображение
Правда заполняет по нажатию на фамилию всё из полей PaySum, PayDate, а не одного сутдента, т.к. твой SQL запрос был не рабочий... сам выясняй почему
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

matdilon
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.08.2010 (Вт) 23:20

Re: Создание запроса к данным

Сообщение matdilon » 12.09.2010 (Вс) 14:26

Спасибо, за ответ, буду разбираться.


Вернуться в ADO.NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList