#sql #vb.net #ms-access #autonumber
#sql #vb.net #ms-access #автономер
Вопрос:
У меня есть база данных gradebook, и когда я вычисляю средние значения, я помещаю их в таблицу в другой базе данных, используя приведенную ниже инструкцию cSQL. У меня есть две проблемы: во-первых, я не могу обновить новую таблицу, потому что у нее нет первичного ключа. Во-вторых, я пытаюсь добавить столбец AutoNumber, чтобы исправить это, но, похоже, я ничего не делаю, чтобы добавить новый столбец для меня. Вот код — чего мне не хватает?
cSQL = "Select [StudentID],[StudentLast] as [Last Name],[StudentFirst] as [First Name], [MI], "
cSQL = cSQL amp; "AVG(Grade) AS [Average], MAX([Letter]) as [Letter], COUNT([Grade]) as [# Assign] "
cSQL = cSQL amp; ",[Subject],[Term] INTO [SubjectAverages] in '" amp; AppDir amp; "averages.mdb'"
cSQL = cSQL amp; " FROM [Grades] WHERE [Subject] = '" amp; FixApost(cboSubject.Text) amp; "' AND [Term] = " amp; LastTerm
cSQL = cSQL amp; " GROUP BY [StudentLast],[StudentFirst],[MI],[StudentID],[Subject],[Term] ORDER BY [StudentLast],[StudentFirst],[MI] ;"
Try
'Use cSQL Statement to calculate Averages into table SubjectAverages in DB: 'Averages.mdb'
OpenDB2()
da = New OleDbDataAdapter(cSQL, con)
dt.Columns.Clear()
dt.Rows.Clear()
da.Fill(dt)
'Add New Column
dt.Columns.Add("Number", GetType(Integer))
'Are these needed?
dt.AcceptChanges()
da.Update(dt)
con.Close()
Catch ex As Exception
Me.Cursor = Cursors.Default
MessageBox.Show("Error during Chart Update." ControlChars.CrLf ex.Message, "Classroom Grader DB Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
CloseandDispose2()
Exit Sub
End Try
Ответ №1:
Там много неправильного. Во-первых, вы не можете изменить схему таблицы базы данных, добавив столбец в a DataTable
. Вам необходимо выполнить ALTER TABLE
инструкцию для базы данных. Вы могли бы сделать это, создав OleDbCommand
и вызывая ExecuteNonQuery
. Чтобы точно узнать, как написать такую инструкцию SQL, вам следует провести некоторое исследование Jet SQL и ALTER TABLE
инструкции в частности.
Тем не менее, если это возможно, было бы гораздо разумнее просто открыть базу данных в Access и визуально внести изменения в схему.
Что касается SQL, который вы фактически выполняете выше, вы вообще не должны использовать адаптер данных. Вы перемещаете данные непосредственно между базами данных без вмешательства вашего приложения, поэтому, опять же, вы должны использовать OleDbCommand
вызов and ExecuteNonQuery
. Если бы вы загружали данные в свое приложение за один шаг, а затем сохраняли их в другой базе данных на другом шаге, адаптер данных a и a DataTable
были бы правильным выбором, хотя структура кода потребовала бы значительных изменений.
Комментарии:
1. Спасибо за предложения — я пока не эксперт. Я просто люблю кодирование и учусь по ходу дела. Моя программа представляет собой зачетную книжку, и в приведенном выше коде я просто пытаюсь суммировать данные об оценках в виде средних значений для отображения в datagridview. Мне не нужно сохранять его, поскольку он всегда будет меняться по мере добавления новых оценок. Мне просто нужно захватить данные, отобразить их (и / или распечатать через Crystal Reports), и все. Я сбрасывал его во «временную» базу данных, которую я мог удалить, когда форма «dataviewgrid» закрыта. Любые предложения ВСЕГДА приветствуются!
2. Действительно ли эта временная база данных полезна? Вы можете просто запросить существующую базу данных и заполнить a
DataTable
в своем приложении, а затем использовать этот локальный кэш любым способом, который вы считаете нужным, например, привязать к aDataGridView
. Если вам не нужно запрашивать временную базу данных из приложения, отличного от текущего, это, похоже, не служит полезной цели.3. Спасибо! Я изучу это и посмотрю, как это работает. Мне нужно будет провести некоторое исследование!