sarfarazbhat Ответов: 2

Сохраните все элементы списка для доступа к таблице базы данных в VB.Net


Здравствуйте друзья
Меня зовут Сарфараз. Я разрабатываю проект в VB.Net и MS Access 2007 ,где я пытаюсь сохранить в базе данных такие сведения о пациенте, как имя, возраст, номер билета и лабораторные исследования.
У меня есть два списка в форме, один из которых содержит все доступные расследования, которые могут быть проведены, а другой-выбранные расследования. Когда я нажимаю на кнопку Сохранить, я хочу сохранить все выбранные расследования для хранения в таблице базы данных.
Пожалуйста, помогите мне в этом. На самом деле я сделал это в vb6 но понятия не имею в чем дело VB.Net.
Чтобы загрузить доступные расследования из базы данных, я использую следующий код, который работает нормально.

Sub loadinvestigations()
       Con.Open()
       Dim cmd As New OleDbCommand("select * from investigation", Con)
       Dim dr As OleDbDataReader = cmd.ExecuteReader
       While dr.Read
           ListBox1.Items.Add(dr(0).ToString.ToUpper)
       End While
       dr.Close()
       Con.Close()
   End Sub
Thank you

[no name]

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

2 Ответов

Рейтинг:
20

RDBurmon

Вот вам и ответ :

Imports System.Data.OleDb
Public Class Form1

    Private Sub btnsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsave.Click


        Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=PatientLabInvestigations.accdb;")

        Dim cmd As New OledbCommand

        Dim var1 As String

        con.Open()

        cmd.Connection = con

        For l_index As Integer = 0 To lstlabinvestigations.Items.Count - 1
            var1 = String.Concat("'", txtpatientname.Text.ToString(), "','", txtpatintage.Text.ToString(), "','", txtpatientticketno.Text.ToString(), "','", CStr(lstlabinvestigations.Items(l_index)).ToString(), "'")
            cmd.CommandText = "INSERT INTO tblLabInvestigations(PatientName,Age,TicketNo,LabInvestigation) VALUES(" + var1 + ")"
            cmd.ExecuteNonQuery()
        Next
        MessageBox.Show("Record saved successfully")
    End Sub

End Class


Надеюсь, это поможет. Попробуйте и если это сработает то примите и проголосуйте за этот ответ


Mike Meinz

Пожалуйста, используйте объекты OLEDBParameter для передачи значений в инструкцию SQL. Использование конкатенированной строки, как показано в решении 1, позволит атаковать SQL-инъекцию. Кроме того, если имя пациента содержит Апостроф (например, Джеймс О'Тул), ваш пример кода не будет выполнен. Использование объектов OLEDBParameter предотвратит эту проблему.

sarfarazbhat

Да, если я попытаюсь вставить имя как Бхат, это даст мне ошибку.Отсутствует оператор в запросе.

Mike Meinz

Вот вам пример о том, как использовать параметризованные операторы SQL с базой данных MS Access. Обратите внимание, что порядок параметров в коллекции должен совпадать с порядком параметров, используемых в инструкции SQL.

Документация Microsoft: Класса Oledbparameter и Олддбкоманд.свойства параметров

sarfarazbhat

Спасибо за вашу любезную помощь.

RDBurmon

Я не думаю, что мы можем использовать SQLParamer с базой данных Access. А мы можем?

sarfarazbhat

Да, если я попытаюсь вставить имя как Бхат, это даст мне ошибку.Отсутствует оператор в запросе:::

Mike Meinz

Спасибо за ваш ответ. Я упустил из виду тот факт, что это была база данных MS Access. При использовании MS Access параметры передаются с помощью У oledbparameter объект.

sarfarazbhat

Я вычислил ответ на выбор скорости отдельных расследований и сохранение скорости для соответствующего расследования. Вот мой код

Con.Open()
For l_index = 0 To ListBox2.Items.Count - 1

query = ("select Investigation.rate " & _
"from Investigation WHERE (((Investigation.Investigation) = '" & ListBox2.Items(l_index) & "'));")

Dim cmd2 As New OleDbCommand(query, Con)
'Con.Open()

Dim reader As OleDbDataReader = cmd2.ExecuteReader

reader.Read()
'Console.WriteLine(reader(0))
txtrate.Text = reader.GetString(0)


reader.Close()
'Con.Close()





' Con.Close()

'End If

Dim SqlString As String = "Insert Into patients (Receipt_No, OPD_MRD,Patientname,Investigation,Receipt_date,Receipt_time,rate) Values (?,?,?,?,?,?,?)"
Dim cmd As OleDbCommand = New OleDbCommand(SqlString, Con)
cmd.CommandType = CommandType.Text
cmd.Parameters.AddWithValue("Receipt_No", txtreceiptno.Text.Trim())
cmd.Parameters.AddWithValue("OPD_MRD", txtopd.Text.Trim())
cmd.Parameters.AddWithValue("Patientname", txtname.Text.Trim())
cmd.Parameters.AddWithValue("Investigation", CStr(ListBox2.Items(l_index)).ToString())
cmd.Parameters.AddWithValue("Receipt_date", lbldate.Text)
cmd.Parameters.AddWithValue("Receipt_time", lbltime.Text)
cmd.Parameters.AddWithValue("rate", txtrate.Text.Trim())
'Con.Open()
cmd.ExecuteNonQuery()

Next
Con.Close()

Но выполнение этой задачи занимает очень много времени, и моя система работает в напряженном режиме почти 10 секунд. Есть ли что-то неправильное в этом коде, пожалуйста, посмотрите
Спасибо

Mike Meinz

Убедитесь, что в этом столбце есть индекс: Investigation.Investigation

sarfarazbhat

Пожалуйста, объясните мне, как выбрать скорость отдельных расследований и сохранить скорость для соответствующего расследования.
Мой код выглядит так

For l_index As Integer = 0 To ListBox2.Items.Count - 1
query = "select Investigation.rate " & _
"from Investigation WHERE (((Investigation.Investigation) = '" & ListBox2.Items(i) & "'));"
cmd = New OleDbCommand(query, Con)
cmd.CommandType = CommandType.Text
/here is the problem i do not know how to get the rate


пожалуйста помочь
Спасибо

sarfarazbhat

Что такое VB.Чистый эквивалент кода VB6 следующего содержания:

For i = 0 To List2.ListCount - 1
sql = "patients"
query = "select Investigation.rate " & _
"from Investigation WHERE (((Investigation.Investigation) = '" & List2.List(i) & "'));"

rs2.Open query, Con, adOpenDynamic
If Not rs2.EOF Then



'Text2.Text = rs!Investigation
Text5.Text = rs2!Rate


End If
'rs2.Close

Set rs = New ADODB.Recordset

rs.Open sql, Con, adOpenDynamic, adLockOptimistic

' Dim X As Long
'For X = 0 To List2.ListCount - 1
With rs
.AddNew
!Receipt_No = Trim(text1.Text)
!OPD_MRD = Trim(text2.Text)
!Patientname = Trim(Text3.Text)

!Investigation = List2.List(i)


!Receipt_date = Label6.Caption
!Receipt_time = Label7.Caption
!Rate = Trim(Text5.Text)

.Update

End With
rs2.Close
rs.Close
Next

На самом деле мне нужно сохранить скорость всех элементов списка. Я могу сделать это в vb6, как показано выше, но не в VB.net
Пожалуйста, направьте меня в этом
Спасибо

Рейтинг:
1

sarfarazbhat

Я попробовал следующий код, и он работал правильно

<br />
 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click<br />
        Dim Str As String<br />
        Try<br />
            Dim i As Integer<br />
            con.Open()<br />
            For i = 0 To ListBox2.Items.Count - 1<br />
                Str = "insert into login values('" + ListBox2.Items.Item(i) + "')"<br />
<br />
<br />
<br />
<br />
                Dim cmd As OleDbCommand = New OleDbCommand(Str, con)<br />
                cmd.ExecuteNonQuery()<br />
                '  Dim Dst As DataSet<br />
<br />
                Dim dad As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM login ORDER BY username", con)<br />
                ' Dad.Fill(Dst, "login")<br />
            Next<br />
            MsgBox("Record inserted successfully...")<br />
            ';   con.Close()<br />
        Catch ex As Exception<br />
            MessageBox.Show("Could Not Insert Record!!!")<br />
            MsgBox(ex.Message & " -  " & ex.Source)<br />
<br />
            con.Close()<br />
        End Try<br />
<br />
<br />
<br />
        Con.Close()<br />
<br />
    End Sub<br />


RDBurmon

Итак, это решило ваш вопрос? У вас есть еще какие-нибудь вопросы?
Я хотел бы вам помочь.

sarfarazbhat

Спасибо<br><br><br> & lt;br>
Я больше запрашиваю, я пытаюсь сохранить записи в базу данных, которая работает просто отлично, но в то же время мне нужно распечатать эту запись (на самом деле квитанцию) Я пишу детали в текстовом файле, но:<br> & lt;br> & lt;br> & lt;br>
Я не могу написать текст в нужных местах в этом текстовом файле, так как в результате печать не выровнена должным образом на бумаге:<br><br><br>;
Я использую код как:<br><br><br> & lt;br>
<br><br><br><br>
Dim file As System.IO.StreamWriter<br><br><br><br>
file = My.Computer.FileSystem.OpenTextFileWriter("text.txt", False)<br><br><br><br>
file.Write(lbldate.Text & vbTab & vbTab & vbTab)<br><br><br><br>
file.Write(lbltime.Text)<br><br><br><br>
file.WriteLine()<br><br><br><br>
file.Write(txtreceiptno.Text & vbTab & vbTab & vbTab)<br><br><br><br>
file.Write(txtopd.Text)<br><br><br><br>
file.WriteLine()<br><br><br><br>
file.Write(txtname.Text & vbTab & vbTab & vbTab)<br><br><br><br>
file.WriteLine()<br><br><br><br>
file.Write("______________________________________")<br><br>
file.WriteLine()<br><br>
file.Close()<br><br>
Dim p As New Process<br>
Dim info As New ProcessStartInfo<br>
info.FileName = "text.txt"<br>
info.Verb = "print"<br>
p.StartInfo = info<br>
p.Start()<br>
<br><br><br> & lt;br>
Кроме того, когда я печатаю квитанцию, также печатается имя текстового файла. Я не знаю почему.
Спасибо