Speichern von Messwerten in einer Access Datenbank

06/09/2008 - 17:53 von Werner Kistner | Report spam
Hallo,
mit beigefügten Code versuche ich 100 Messwerte in eine vorhandene Datenbank
einzufügen. Die entsprechende Spalte hat auch 100 Rows. Es wird jedoch die
gesammte Liste, schon beim ersten Durchlauf der shI-Schleife, mit dem ersten
Messwert gefüllt. Was mache ich da schon wieder Falsch?
Besten Dank für Hilfe
Werner
''' <summary>

''' SetAccessCalib

''' </summary>

''' <param name="DRead">Werte die gespeichert werden sollen.</param>

''' <param name="DList">Name der Tabelle.</param>

''' <param name="DCol">Name der Spalte.</param>

''' <remarks>Speicherung von Kalibrierwerten. Diese sind in der Tabelle als
Double deklariert.</remarks>

Sub SetAccessCalib(ByRef DRead() As Single, ByVal DList As String, ByVal
DCol As String)

'06.09.08******************************SetAccessCalib

Dim my_Con As OleDbConnection = Nothing

Dim cmd As OleDbCommand, s As String, res As Int16

Datenbank = con.AppPath & "ENCalibDataNET.MDB"

Try

my_Con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Password=;" &
_

"User ID=Admin;Data Source=" & _

Datenbank)

For shI As Short = 0 To CShort(UBound(DRead))

'*1* SQL-Anweisung generieren

s = "UPDATE " + DList + " SET " & " " + DCol + " = '" & DRead(shI).ToString
& "'"

'*2* Command-Objekt erzeugen

cmd = New OleDbCommand(s, CType(my_Con, OleDbConnection))

'*3* Command ausführen

If my_Con.State <> ConnectionState.Open Then my_Con.Open()

res = CShort(cmd.ExecuteNonQuery)

Next shI

Catch ex As Exception

MsgBox("Fehler in SetAccessCalib: " & vbCrLf & vbCrLf & ex.ToString)

Finally

my_Con.Close()

End Try

End Sub
 

Lesen sie die antworten

#1 Peter Götz
06/09/2008 - 21:01 | Warnen spam
Hallo Werner,

mit beigefügten Code versuche ich 100 Messwerte
in eine vorhandene Datenbank einzufügen.



Willst Du neue Datensàtze einfügen oder willst Du
einen Wert in ein Feld eines bereits in der DB-
Tabelle vorhandenen Datensatzes schreiben?

Die entsprechende Spalte hat auch 100 Rows.



Welche Spalte hat 100 Rows?
Was meinst Du mit Spalte?

Enthàlt Deine DB-Tabelle bereits 100 Datensàtze?


Es wird jedoch die gesammte Liste, schon beim
ersten Durchlauf der shI-Schleife, mit dem ersten
Messwert gefüllt. Was mache ich da schon wieder
Falsch?



Bis jetzt ist noch nicht mal klar, was Du überhaupt
machen willst.

... schnipp...

Sub SetAccessCalib _
(ByRef DRead() As Single, _
ByVal DList As String, _
ByVal DCol As String)

'06.09.08******************************SetAccessCalib

Dim my_Con As OleDbConnection = Nothing
Dim cmd As OleDbCommand, s As String, res As Int16
Datenbank = con.AppPath & "ENCalibDataNET.MDB"



Wer oder was ist "con"?

Try
my_Con = New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0;Password=;" & _
"User ID=Admin;Data Source=" & Datenbank)



"Password=" und "User ID=ID" sind in diesem
Connectionstring überflüssig.


For shI As Short = 0 To CShort(UBound(DRead))



Warum verwendest Du als Schleifenzàhler einen
Wert vom Typ Short?
Bei 32-Bit-Systemen ist es besser einen 32-Bit
breiten Wert, also Integer (Int32) zu verwenden.


'*1* SQL-Anweisung generieren

s = "UPDATE " + DList + " SET " & " " + DCol + " = '" & _
DRead(shI).ToString & "'"



Dein fröhliches Durcheinander von "+" und "&" zur
Stringverknüpfung macht Deinen Code nicht gerade
gut lesbar. In VB ist der &-Operator für Stringver-
knüpfungen vorgesehen.

'*2* Command-Objekt erzeugen

cmd = New OleDbCommand(s, CType(my_Con, OleDbConnection))



Was soll dieses CType()?
my_Con hast Du doch bereits als OleDbConnection
deklariert.


'*3* Command ausführen

If my_Con.State <> ConnectionState.Open Then my_Con.Open()



Connection.State kann sehr wohl <> ConnectionState.Open
sein wenn die Connection geöffnet ist.
Mit

if (Con.State and ConnectionState.Open) = _
ConnectionState.Open

gibt es keine Probleme.


res = CShort(cmd.ExecuteNonQuery)



Auch hier wieder die Frage, warum Du einen von
Cmd.Execute gelieferten Rückgabewert in den
Datentyp Short umwandelst?


Next shI

Catch ex As Exception

MsgBox("Fehler in SetAccessCalib: " & vbCrLf & vbCrLf & ex.ToString)

Finally

my_Con.Close()

End Try

End Sub



Damit es keine Vertipper und sonstige Fehler beim
Connectionstring gibt, solltest Du zum erstellen des
ConnectionStrings besser einen ConnectionStringBuilder
verwenden:

Dim CSB As New OleDbConnectionStringBuilder
With CSB
.Provider = "Microsoft.Jet.OLEDB.4.0"
.DataSource = strFile

' DBPasswort
If DataBasePassword.Length > 0 Then
.Add("Jet OLEDB:Database Password", _
DataBasePassword)
End If

' Connectionpooling ausschalten
.OleDbServices = -4

' DB im geteilten Modus öffnen
.Add("Mode", "Share Deny None")

' Pagelocking ab Access-Version 2000
.Add("Jet OLEDB:Database Locking Mode", 1)
End With

Dim Cnn As OleDbConnection = New OleDbConnection
Cnn.ConnectionString = CSB.ConnectionString

Try
Cnn.Open()

Catch Ex As Exception
MsgBox _
(Ex.Message, _
MsgBoxStyle.Exclamation)

End Try


Um einen neuen Datensatz in eine DB-Tabelle einzufügen
verwende Parameterobjekte zur Übergabe der Werte.
Im nachfolgenden Code wird ein neuer Datensatz mit den
Feldern ID (Int32), Text (VarWChar) u. Wert (Single) in
die Tabelle "DBTabellenName" eingefügt.

Dim TableName As String = "DBTabellenName"
Dim strSQL As String = _
"Insert Into " & TableName & _
" (ID, Text, Wert)" & _
" Values (?, ?, ?)"
Dim Cmd As New OleDbCommand(strSQL, Cnn)
Cmd.Parameters.Add("@ID", OleDbType.BigInt)
Cmd.Parameters.Add("@Text", OleDbType.VarWChar)
Cmd.Parameters.Add("@Wert", OleDbType.Single)

Cmd.Parameters(0).Value = 123
Cmd.Parameters(1).Value = "Ein Text"
Cmd.Parameters(2).Value = 125.12

Try
Dim Ret As Integer = Cmd.ExecuteNonQuery

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation)
End Try


Und auch beim Ändern eines Datensatzes ist es
weniger fehlertràchtig, wenn Du zur Übergabe der
Werte Parameterobjekt verwendest.
Im folgenden Beispiel wird in den Datensatz mit der
ID = 123 ein neuer Wert (995.33) in das Feld Wert
geschrieben.

Dim TableName As String = "DBTabellenName"
Dim strSQL As String = _
"Update " & TableName & _
" SET Wert = ?" & _
" WHERE ID = ?"

Dim Cmd As New OleDbCommand(strSQL, Cnn)
Cmd.Parameters.Add("@Wert", OleDbType.Single)
Cmd.Parameters.Add("@ID", OleDbType.BigInt)

Cmd.Parameters(0).Value = 995.33
Cmd.Parameters(1).Value = 123

Try
Dim Ret As Integer = Cmd.ExecuteNonQuery
If Ret = 0 Then

MsgBox _
("Kein Datensatz mit ID = 123 vorhanden!", _
MsgBoxStyle.Information)

End If

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation)

End Try

Die Jet-Engine arbeitet im Gegensatz zu vielen anderen
DB-Systemen mit sog. Stellungsparametern. D.h. die
Parameter im SQL-String werden nicht anhand ihres
Namens identifiziert, sondern anhand ihrer Position
im SQL-String. Der Platzhalter für Parameter im SQL-
String ist in diesem Fall das Fragezeichen (?).
Das erste Fragezeichen im SQL-String steht also für
das erste Parameterobjekt [Cmd.Parameters(0)], das
zweite Fragezeichen für das zweite Parameterobjekt
[Cmd.Parameters(1)] usw.
Die Parameternamen ("@Wert", "@ID") sind für die
Jet-Engine ohne Bedeutung. Ich verwende gerne die
Kombination "@" & FeldName, weil damit im Code
leichter ersichtlich ist, welcher Parameter für welches
Feld zustàndig ist, man könnte aber ebenso völlig
andere Parameternamen vergeben.

Mehr dazu findest Du unter

www.gssg.de -> Visual Basic -> VB.net
-> DB CommandObjekte / DataReader
-> OLEDB1 (Access.mdb)

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen