Zum Inhalt wechseln


Foto

SQL Tabellen


  • Bitte melde dich an um zu Antworten
30 Antworten in diesem Thema

#16 bergesel

bergesel

    Senior Member

  • 372 Beiträge

 

Geschrieben 10. Juli 2008 - 11:51

@Alle

gut dann entschuldige ich mich bei nils hoch-offiziell, für mein überreagiertes verhalten.

..habe mal die msgbox eingebaut. so wie es aussieht bleibt er bei nuser mit diesem fehler hängen: invalid use of null

strComputer = "[%ComputerName%]"

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colRetrievedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent")

For Each objEvent in colRetrievedEvents

dim Category
dim ComputerNameEV
dim EventCode
dim Message
dim RecordNumber
dim SourceName
dim TimeWritten
dim nType
dim nUser

Category = objEvent.Category
ComputerNameEV = objEvent.ComputerName
EventCode = objEvent.EventCode
Message = objEvent.Message
RecordNumber = objEvent.RecordNumber
SourceName = objEvent.SourceName
TimeWritten = objEvent.TimeWritten
nType = objEvent.Type
nUser = objEvent.User     hier bricht er ab mit schreiben und bringt die meldung invalid use of null

Set db = CreateObject("ADODB.Connection")
db.Open("Provider=SQLOLEDB.1;Data Source=server; Trusted_Connection=Yes;User ID=sa;Password=xxxx;")
sql = "use wartung;"
db.Execute(sql)

  sql = "INSERT INTO " & strcomputer & "(Category,ComputerNameEV,Eventcode,Message,RecordNumber,SourceName,TimeWritten,nType,nUser)"
  sql = sql & "values ('" & Category & "','" & ComputerNameEV & "','" & EventCode & "','" & Message & "','" & RecordNumber & "','" & SourceName & "','" & TimeWritten & "','" & nType & "','" & nUser & "');"
  db.Execute(sql)
  db.close
next



#17 NilsK

NilsK

    Expert Member

  • 12.332 Beiträge

 

Geschrieben 10. Juli 2008 - 12:29

Moin,

gut dann entschuldige ich mich bei nils hoch-offiziell, für mein überreagiertes verhalten.


okay, angenommen. Kann ja mal vorkommen.

nUser = objEvent.User hier bricht er ab mit schreiben und bringt die meldung invalid use of null


Kann ich nicht bestätigen. Hier läuft das problemlos durch. (Allerdings habe ich "[%ComputerName%]" ersetzt durch ".", um eine gültige WMI-Ansprache zu erzeugen. Und ich habe alle Zeilen zur Datenbankansprache auskommentiert, mangels Datenbank - die WMI-Ansprache funktioniert jedenfalls.)

Du hast in deinem Originalskript nicht zufällig die Fehlerbehandlung abgeschaltet und dadurch evtl. versehentlich den Fehler der falschen Stelle zugeordnet?

Darüber hinaus sieht mir aber das SQL-Statement falsch aus:

sql = "INSERT INTO " & strcomputer & "(Category,ComputerNameEV,Eventcode,Message,RecordNumber,SourceName,TimeWritten,nType,nUser)"



Hinter INSERT INTO muss m.E. noch VALUES stehen:

sql = "INSERT INTO " & strcomputer & " VALUES(Category,ComputerNameEV,Eventcode,Message,RecordNumber,SourceName,TimeWritten,nType,nUser)"

Ich habe es jedenfalls noch nie ohne verwendet, und wenn ich die Syntaxbeschreibung richtig interpretiere, ist das Schlüsselwort nicht optional (da kann ich mich aber irren):

INSERT (Transact-SQL)

Ganz nebenbei: Vermutlich geht es dir darum, die Events besser auswerten zu können. Vielleicht kannst du dir den SQL-Server-Import sparen und mit dem Log Parser arbeiten, der dir eine mächtige SQL-Engine für das native Eventlogformat (sowie zahlreiche andere Formate) bietet:

.: www.kaczenski.de :.

Download details: Log Parser 2.2

Gruß, Nils

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#18 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 10. Juli 2008 - 12:42

...
Darüber hinaus sieht mir aber das SQL-Statement falsch aus:

Hinter INSERT INTO muss m.E. noch VALUES stehen:
...


Der INSERT ist so schon ok. "VALUES" steht in der nächsten Zeile ;)
Wenn man nur bestimmte Spalten ansprechen will, muss man die vorher angeben.
Allerdings fehlt in dem INSERT-String ein Leerzeichen vor der Klammer!
...strcomputer & "(Category...
Richtig wäre:
...strcomputer & " (Category...

My name is Frank, you can say you to me.

#19 bergesel

bergesel

    Senior Member

  • 372 Beiträge

 

Geschrieben 10. Juli 2008 - 13:05

@nils

habe nun auch auf "." gewechselt um den gleichen stand zu haben.
nun bekomme ich den fehler incorrect syntax near '('. line 40

und wen ich nun noch logparser dazu nehme hab ich gar kein plan mehr und kann sicherlich dann die domäne wechseln :)

@cybquest dies habe ich angepasst oder stimmte schon :)

ist es möglich das im eventlog(massage) eine datei so gekennzeichnet ist z.B 'xxx.dll' das diese hochkomas den fehler zum schreiben in sql den fehler verursachen?

das script schreibt halt nur teilweise und die spalte nUser bleibt leer sollte auch nicht sein.

gruss

#20 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 10. Juli 2008 - 13:12

Nu ja... der Hinweis "incorrect syntax near (..." würde ja schon auf ein fehlendes Leerzeichen hinweisen.
Vor "values" fehlt übrigens auch noch ein Leerzeichen!
Hier der kpl. korrigierte String:
Ggf. mal unterhalb nen Msgbox sql... ;)
sql = "INSERT INTO " & strcomputer & " (Category,ComputerNameEV,Eventcode,Message,RecordNumber,SourceName,TimeWritten,nType,nUser)"
sql = sql & " values ('" & Category & "','" & ComputerNameEV & "','" & EventCode & "','" & Message & "','" & RecordNumber & "','" & SourceName & "','" & TimeWritten & "','" & nType & "','" & nUser & "');"

Msgbox sql

My name is Frank, you can say you to me.

#21 NilsK

NilsK

    Expert Member

  • 12.332 Beiträge

 

Geschrieben 10. Juli 2008 - 13:25

Moin,

Der INSERT ist so schon ok. "VALUES" steht in der nächsten Zeile ;)


... hust ... ja, manchmal sollte man die Augen öffnen.

wen ich nun noch logparser dazu nehme hab ich gar kein plan mehr


Nicht dazu, sondern stattdessen. Damit könntest du dir sehr viel von dem Ärger ersparen, den du beim SQL-Import hast. Denn es geht dir ja vermutlich eigentlich um die Auswertung, oder?

ist es möglich das im eventlog(massage) eine datei so gekennzeichnet ist z.B 'xxx.dll' das diese hochkomas den fehler zum schreiben in sql den fehler verursachen?


Nicht nur eine Datei, das kann überall im Text stehen. Das müsstest du also in deinem Skript noch maskieren.

die spalte nUser bleibt leer


Events müssen keine User-Angabe haben, also solltest du das abfangen (wie auch bei anderen Feldern). Gut möglich, dass da die "invalid use of NULL"-Meldung herkam.

Gruß, Nils

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#22 bergesel

bergesel

    Senior Member

  • 372 Beiträge

 

Geschrieben 10. Juli 2008 - 13:48

..ja stimmt mit values, hab ich angepasst und die msgbox hinzugefügt.

meldung:
INSERT TO . (Category, usw,nuser) values ('0',alle werte,'information',");

danach fehlermeldung incorrect syntax near (

#23 NilsK

NilsK

    Expert Member

  • 12.332 Beiträge

 

Geschrieben 10. Juli 2008 - 13:57

Moin,

meldung:
INSERT TO . (Category, usw,nuser) values ('0',alle werte,'information',");

danach fehlermeldung incorrect syntax near (


also, nimm's mir bitte nicht übel, aber ich habe trotzdem den Eindruck, dass dir etwas der Hintergrund fehlt, um deine anspruchsvolle Aufgabe anzugehen. Vielleicht wäre Log Parser doch etwas für dich?

Du hast jetzt den Computernamen im Skript auf "." gesetzt. Damit funktioniert die WMI-Abfrage, weil WMI den Punkt als Platzhalter für den lokalen Rechner akzeptiert. Nun geht aber dein SQL-Statement nicht mehr - kann es auch nicht. Guck es dir mal an: Du versuchst, Daten in eine Tabelle namens "." zu schreiben. Die gibt es natürlich nicht (kann es auch nicht, ist kein gültiger Name).

Du musst deinem Skript also einen gültigen Computernamen übergeben. Und damit sind wir irgendwie wieder am Anfang.

Als kleines Goodie: So liest man in VBS den lokalen Computernamen aus:

set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName
WScript.echo strComputer

Gruß, Nils

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#24 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 10. Juli 2008 - 14:10

@bergesel
Also weisst Du, ein wenig erschüttert bin ich jetzt schon!
Das Thema "Computername" haben wir eigetlich zur Genüge durchgenudelt, dass du da jetzt hättest selber draufkommen müssen, oder?
Lies doch bitte die Hinweise, die wir dir geben, aufmerksam durch.

Genau DAS, was Nils da beschreibt, ist das Problem. Du braucht einen korrekten Computernamen für die SQL-Strings. Keinen Punkt oder sonst einen Platzhalter.
My name is Frank, you can say you to me.

#25 bergesel

bergesel

    Senior Member

  • 372 Beiträge

 

Geschrieben 10. Juli 2008 - 14:19

@cybquest
das meinte ich ja wegen computername, dass ich für mich den "[%Computername%]" nehmen muss für mich.
@nils
ok ich schau mir dies mal mit dem logparser mal an. werd ich wohl bald einträge machen mit logparser ;-)

#26 Christoph35

Christoph35

    Expert Member

  • 3.624 Beiträge

 

Geschrieben 10. Juli 2008 - 14:32

Lies doch einfach den Computernamen mit Nils´ Codesnippet in die Variable strComputer ein, NICHT über [%computername%].

Diese Variable musst Du dann in den SQL-String einbauen, aber nicht innerhalb der Anführungszeichen.
MCSE+M+S, VCP, MCITP Enterprise Admin.
Always look on the bright side of life!

#27 bergesel

bergesel

    Senior Member

  • 372 Beiträge

 

Geschrieben 21. Juli 2008 - 11:26

Hallo zusammen

wollte euch nur noch meine lösung presentieren ;-)

On Error Resume Next
strComputer = "[%ComputerName%]"

'strComputer = "."

                             
  Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
  Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem",,48)
  For Each objItem in colItems
    'Variablen setzen
    dim ComputerName

    'Domäne: DNSHostname, sonst Name
    on error resume next
    ComputerName = objItem.DNSHostName
    if err > 0 then ComputerName = objItem.Name
    on error goto 0
    'Ende der Hostabfrage
    'msgbox computername
next

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colRetrievedEvents = objWMIService.ExecQuery _
    ("Select * from Win32_NTLogEvent")

For Each objEvent in colRetrievedEvents

dim Category
dim ComputerNameEV
dim EventCode
dim Message
dim RecordNumber
dim SourceName
dim TimeWritten
dim nType
dim nUser

Category = objEvent.Category
ComputerNameEV = objEvent.ComputerName
EventCode = objEvent.EventCode
Message = objEvent.Message
RecordNumber = objEvent.RecordNumber
SourceName = objEvent.SourceName
TimeWritten = objEvent.TimeWritten
nType = objEvent.Type
nUser = objEvent.User


Dim MessageFull
Dim MessageCut

MessageFull = Message
'MessageCut = Replace(MessageFull,"'","""")
'Message = MessageCut

if len(MessageFull) > 0 then 
  MessageCut = Replace(MessageFull,"'","!")
else
  MessageCut = ""
end if


Set db = CreateObject("ADODB.Connection")
db.Open("Provider=SQLOLEDB.1;Data Source=meinserver;Trusted_Connection=Yes;Initial Catalog=wartung;User ID=sa;Password=xxxx;")
sql = "use wartung;"
db.Execute(sql)         


sql = "INSERT INTO " & ComputerName & "  (Category,ComputerNameEV,Eventcode,MessageCut,RecordNumber,SourceName,TimeWritten,nType,nUser)"
  sql = sql & "values ('" & Category & "','" & ComputerNameEV & "','" & EventCode & "','" & MessageCut & "','" & RecordNumber & "','" & SourceName & "','" & TimeWritten & "','" & nType & "','" & nUser & "');"
  db.Execute(sql)
  db.close

Next         hier!!!!!????


nun bekomm ich aber immer noch ne meldung und die ist am schluss bei next trotz befehl im script on error resume next wie das?:

error:0x80041001
code:80041001

google suche bringt mir nicht wirklich erklärende hilfe für den code.

aber ansonsten funktionierts ja, stört mich einfach! :)

#28 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 21. Juli 2008 - 11:37

Der Code gehört zu einem "allgemeinen Fehler"...
Ich würde empfehlen, das "on error resume next" mal auszukommentieren, um den Fehler zu lokalisieren.
My name is Frank, you can say you to me.

#29 bergesel

bergesel

    Senior Member

  • 372 Beiträge

 

Geschrieben 22. Juli 2008 - 14:27

@cybquest

danke habe ich schon versucht und musste feststellen es liegt nicht an dem script.
ich habe mich mit dem softwarehersteller kurz geschlossen. nun habe ich ihm meine sql tabellen wie ich sie mir erstellt habe mit den scripts usw. zu gestellt. er hat dies auf seinem system getestet und musste "leider" :) feststellen, dass es bei ihm problemlos funktioniert. nun weis ich das es an meinem system liegt. jemand eine idee was an meinem system faul sein kann? was kann ich prüfen, testen. eventlogs habe ich mir auch schon durchgesehen. auch im ordner C:\WINDOWS\system32\wbem\logs habe ich nach den fehler gegooglet. bin ratlos was ich auf dem server konfig muss damit dies funzt!

danke für tipps und anregungen

gruss bergesel

#30 bergesel

bergesel

    Senior Member

  • 372 Beiträge

 

Geschrieben 23. Juli 2008 - 09:28

@alle

so nun funktioniert alles einwandfrei. es lag an den 2 clients mit denen ich getestet habe.

danke an alle für ihre geduld :)