1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. misterspeed

Beiträge von misterspeed

  • Performance von SQLite optimieren?

    • misterspeed
    • 10. Juni 2013 um 14:38
    Zitat von TheLuBu

    Ich glaube du verfehlst denn Sinn eines RDBMS ;)

    Im Bench Beispiel hier definitiv, aber da die Anzeige der Daten (und durchaus auch großer Datenmengen bzw. aller Daten) nunmal ein Hauptbestandteil des realen Programms ist darf ich das natürlich bei der Frage ob sich ein Umstieg auf SQL lohnt oder auch nicht lohnt natürlich nicht vernachlässigen.

    Zitat von TheLuBu


    Der Geschwindigkeitsvorteil kommt, sobald du Bedingungen hast.
    Willst du immer alle Datensätze aus der Datenbank abrufen? Wohl eher nicht :D
    Eine einzige WHERE Bedingung sollte den Geschwindigkeitsvorteil eigentlich schon deutlich machen.

    Natürlich nicht immer, aber z.B. zum Programmstart und auch immer dann wenn die Filter des Listviews zurückgesetzt werden. Manche Filter schränken auch kaum ein, daher entstehen selbst bei Filterung teilweise noch über 1000 Ergebniszeilen. Daher ist die Performance insbesondere in diesem Fall sehr wichtig. Klar wenn der Filter wirklich stark einschränkt oder nur das Ergebnis einer Berechnung (sum/avg...) relevant ist dürfte SQL deutlich im Vorteil sein, das habe ich oben aber denke ich auch schon erwähnt.

    Da mir der Vorteil also durchaus bewusst ist war eben die Frage ob ich noch Möglichkeiten habe den eher ungünstigen Fall, also viele Ergebniszeilen irgendwie zu beschleunigen. Mit 600ms kann ich im Moment leben, das Problem ist nur, dass die Daten in 1-2 Jahren den doppelten Umfang haben werden und wir dann nicht mehr von 600ms, sondern von 1,2 Sekunden reden, was eher unschön wäre und den Einsatz einer SQL Lösung aus Performance sicht in Frage stellt.

    Zitat von TheLuBu


    Oder auch, sollte sich deine Datenbank weiterentwickeln, mehrere Tabellen (3te. Normalform etc), JOINS,
    VIEWS wie du schon gesagt hast, Hinzufügen, ändern und Löschen von einzelnen Datensätzen oder auch größeren Datenmengen,
    darin liegt der Vorteil eines RDBMS ;)

    Jupp, das war naürlich alles angedacht, allerdings bin ich mir noch nicht sicher ob es wirklich sinnvoll wäre eine Normalisierung vorzunehmen. Ich spare dadurch zwar Redundanz ein, allerdings gestaltet sich die Verwaltung komplexer und die Zugriffsgeschwindigkeit leidet vermutlich auch ein wenig (zumindestens hat das meine Lehrerin mal behauptet). Da ich das Thema aber prinzipiell interessant finde werde ich das auf jedenfall irgendwann mal in Angriff nehmen. Schon alleine weil ich all mein theoretisches Wissen in diesem Bereich bislang kaum praktisch anwenden konnte/musste.

    Zitat von TheLuBu


    Selbes Ergebnis, aber 10mal Schneller ;)

    PRAGMA TABLE INFO: 3.01685434320743
    _SQLite_FetchNames: 0.352390055538509

    Verdammt die Funktion ist mir ganz entgangen. Hätte ich mir die Recherche auf der sqlite page sparen können. :D Letzlich aber eh nur ein Gewinn von 3ms, also nicht wirklich der Rede wert, das Listview wird ja glücklicherweise nicht tausende male neu erstellt.


    So nun zurück zum eigentlichen Problem:

    Ich habe nachwievor den Verdacht, dass die 3000 Aufrufe von FetchData (dürften jeweils Autoit DLL calls sein) den Flaschenhals darstellen und nicht die Zeit die Sqlite für die Erstellung der Ergebnistabelle oder das Parsing des SQL Befehls verschlingt. Daher hatte ich noch einen Gedanken wie man prinzipiell die Zeit massivst verkürzen könnte. Theoretisch könnte ich wie folgt vorgehen:

    1. Stored function in der DB erstellen, welche das SQL Query erledigt und sämtliche Ergebniszeilen verkettet und in einer einzigen Rückgabvariable speichert.
    2. Stored function in Autoit aufrufen, es sollte nun nur noch ein einziges FetchData nötig sein um einen riesigen String, der die ganze Tabelle enthält zu bekommen
    3. String per Autoit wieder in Zeilen zerlegen und damit das Listview befüllen

    Praktisch scheitert das Vorhaben aber offensichtlich daran, dass SQLite keine stored functions/procedures kennt. Und ja das Vorhaben klingt auch äusserst eklig, dennoch hätte so theoretisch die Zahl der "externen" DB Zugriffe / dll calls deutlich reduziert werden können.
    Nun gut es scheint eh nicht zu gehen, also erstmal wieder verworfen.

    Könnte man eine Zeilenverkettung auch mit einem verschachtelten Select hinbekommen? Die Frage wäre aber auch ob der Zeitgewinn durch die Reduzierung der dll calls letztlich nicht wieder durch das Stringsplit in Autoit aufgefressen wird...

  • Performance von SQLite optimieren?

    • misterspeed
    • 8. Juni 2013 um 21:24

    Vielleicht kannste mir auch den Unterschied zwischen einem "prepared Statement" und einem gewöhnlichem "Statement" erklären. Ich weiß zwar, dass es das gibt (habe SQL in Verbindung mit JDBC und einer Oracle DB gelernt), aber so ganz den Vorteil eines "prepared Statements" hab ich glaube nicht verstanden. Ich habe mir das seither so vorgestellt, dass bei einem "prepared Statement" die Ergebnisstabelle vom RDBMS auch nach dem letzten Zugriff auf die Ergebnistabelle noch temporär gespeichert wird um beim erneuten Aufruf des selben Statements das Ergebnis gleich parat zu haben. Nun wenn dem so sein sollte nutzt mir das beim allerersten Zugriff nur dann was, wenn das RDBMS schon vorher lief und jemand anderes diese Anfrage gestellt hat. Das ist bei SQLite aber ja nicht der Fall, da das RDBMS bei Programmende heruntergefahren wird (kein permanent laufender zentraler Server). Ich hätte also beim Initialisieren des LW keinen Vorteil, höchstens später im Programmverlauf bei erneuter Anzeige des ungefilterten LW.

    Nehmen wir mal an ich hab das doch richtig verstanden und es ist so wie ich das beschrieben habe. Würde mir das wirklich nutzen? Geht die meiste Zeit wirklich durch die Erstellung der Ergebnistabelle verloren, oder ist es nicht viel wahrscheinlicher, dass die meiste Zeit beim Auslesen der Ergebnistabelle mit "fetchdata", also der Datenübertragung zwischen RDBMS und Autoit verloren geht? Wenn letzteres zutrifft nutzt auch ein "prepared statement" nichts.

  • Performance von SQLite optimieren?

    • misterspeed
    • 8. Juni 2013 um 18:20

    JSON ist doch eher aufwendiger zu parsen als eine CSV Datei, kann mir nicht vorstellen, dass das konkurrenzfähig wäre.

    Und nein muss natürlich keine SQL DB sein. Prinzipiell bin ich mit meiner CSV Struktur glücklich, aber eine SQL DB würde vieles vereinfachen und beschleunigen. In meinen realen Daten habe ich z.B. auch Integer Werte, deren Durchschnitt berechnet werden muss. Das ganze dann noch für jeden Benutzer separat, welcher in einer weiteren Spalte gespeichert ist. Außerdem soll gezählt werden wieviele Objekte einer bestimmten Art (es gibt mehrere) von einem bestimmten Benutzer stammen und noch einige andere Dinge, wie Sortierung und Filterung anhand von Monat/Jahr plus die zugehörigen Durchschnittswerte und viele weitere Filter...

    Bislang durchlaufe ich dazu das 2D-Array, welches aus der CSV erstellt wurde, teilweise muss dies zur Laufzeit mehrfach gemacht und gefilterte Kopien des Arrays erzeugt werden, was performance mässig nicht unbedingt optimal ist. Da ich das aber schon sehr weit optimiert habe läuft das so ganz ordentlich wie es ist. (viele Dinge werden im selben Schleifendurchlauf berechnet/gezählt)

    Warum dann nun SQL?

    Damit wären diese Berechnungen und Filterungen deutlich einfachher, flexibler und vorallem schneller. In meinen Tests wird der Durchschnitt aller Werte etwa 6 mal so schnell durch ein "SELECT AVG(...)" berechnet als ich das mit einem gleichwertigen Autoit Arraydurchlauf hinbekommen könnte. Die Frage ist nun natürlich ob die SQL Variante insgesamt schneller oder vielleicht doch langsamer ist, denn wie es scheint ist gerade bei großen Ergebnismengen die CSV/Array Struktur im Vorteil. Mit SQL wäre aber mein Quellcode wesentlich übersichtlicher und ich bräuchte keine komplexe Filterfunktion mehr, sondern nur noch eine handvoll abgestimmter oder flexibler SQL Querys, ggf. auch in der DB hinterlegte "Views", die dann nur noch angezeigt werden und mir die SELECT Programmierung im jeweiligen Programm fast komplett ersparen. Ich denke SQL ist wirklich optimal wenn es darum geht solche Datenmengen auszuwerten und zu verarbeiten.

    Nachdem ich nun aber etwas enttäuscht von der Performance bei der LW Erstellung war/bin überlege ich noch ob ich wirklich auf SQLite umsteigen sollte. Nutzt letztlich ja nix, wenn es dadurch insgesamt nicht schneller sondern langsamer wird.

  • Performance von SQLite optimieren?

    • misterspeed
    • 8. Juni 2013 um 17:13

    Habs mal oben eingebaut, aber wie erwartet auch keine besonders flotte Variante. Es ist zwar ein wenig schneller als meine "2DArray" Lösung mit manueller Befüllung, aber etwas langsamer als das reine "Fetch" und deutlich langsamer als "LWjoin" und "CSV".

    Code
    CSV-Methode Time: 			320.907018040784
    SQL-LWjoin-Methode Time: 		617.583219529994
    SQL-Fetch-Methode Time: 		1058.91033191224
    SQL-2DArray_LWArrAdd-Methode Time: 	1172.8774607297
    SQL-2DArray-Methode Time: 		1325.62754093183
  • Performance von SQLite optimieren?

    • misterspeed
    • 8. Juni 2013 um 16:38

    Hab mal noch ein wenig rumgespielt und es tatsächlich geschafft die Geschwindigkeit zu verdoppeln, trotzdem ist die CSV Variante immernoch doppelt so schnell als die SQL Lösung.

    Der Trick:

    [autoit]

    _SQLite_Query ( $hDB, "SELECT " & StringReplace($allColumNames,"|"," || '|' || ") & " FROM " & $tablename, $hQuery )

    [/autoit]

    Durch das modifizierte Select macht SQLite bereits die Stringverkettung der Spalten. dadurch muss ich die einzelnen Zeilen Ergebnisse nur noch direkt an GUICtrlCreateListViewItem(...) übergeben und spare mir das vorherige Verketten. Wie gesagt wer noch Ideen hat immer her damit, aber langsam wird die Geschwindigkeit akzeptabel.

  • Performance von SQLite optimieren?

    • misterspeed
    • 8. Juni 2013 um 12:37

    Ahja stimmt das macht Sinn die Inserts zu einem SQL String zusammenzufassen und als eine Transaktion anzusehen, war schon etwas verwundert weil es wirklich lange dauert die Tabelle zu erzeugen. Letztlich aber wie gesagt eh nur ein einmaliger Import Vorgang, spätere Schreibvorgänge werden ohnehin immer nur eine Zeile betreffen. Ich habs oben mal eingebaut, ist wirklich super schnell nun, danke für den Tipp.

    Was die Funktion _SQLite_GetTable2d anbelangt. Ich hatte ursprünglich genau diese Funktion verwendet, allerdings ist diese nochmal etwas langsamer. Grund ist, dass dort im Prinzip auch nur fetchdata in einer Schleife für alle Zeilen genutzt wird, außerdem muss ich nachdem ich das Array habe nochmals komplett durch das Array laufen um letzlich das Listview zu befüllen. Dadurch dauert das ganze etwa 250ms bzw. 25% länger als wenn ich es direkt selbst mit Fetchdata realisiere und mir dadurch einen Schleifendurchlauf erspare. Ich habe auch mal diese Variante oben eingebaut.

    Vielleicht hat ja noch jemand eine Idee?

  • Performance von SQLite optimieren?

    • misterspeed
    • 7. Juni 2013 um 23:22

    Ich versuche mich gerade daran eine CSV Datenstruktur in eine SQLite DB zu wandeln. Das funktioniert auch bestens und gerade was das Durchsuchen und Filtern angeht sind die Geschwindigkeitsvorteile enorm, allerdings ist das initiale Einlesen aller Datensätze zum Befüllen eines Listviews extrem langsam verglichen mit meiner alten Variante die CSV Struktur in ein 2D Array einzulesen und darüber zeitgleich das Listview zu befüllen.

    Die Daten:
    Ich habe 6 Spalten und ungefähr 3000 Zeilen, also eine CSV Datei mit 3000 solcher Zeilen

    Code
    Spalte1,Spalte2,...,Spalte6


    Die entsprechende SQL DB hat dementsprechend ebenfalls eine Tabelle mit 6 Spalten und 3000 Zeilen.

    Die Dauer:
    Das einlesen der CSV Datei inklusive der Listview Befüllung benötigt etwa 300ms.
    Das einlesen der SQL Datei inklusive der Listview Befüllung benötigt etwa 900ms, also dreimal solange.

    Mein Bench Script:
    Anmerkung: Bei der ersten Ausführung werden die CSV und DB Datei erzeugt, was leider auf meinem System 2 Minuten dauert. Das ist letzlich aber egal, denn die CSV->DB Transformation muss ich ohnehin nur einmalig beim finalen Umstieg erledigen. thx BugFix

    Spoiler anzeigen
    [autoit]


    #include <file.au3>
    #include <array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <GuiListView.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $csvFile = @ScriptDir & "\bench.csv"
    Global $sqlFile = @ScriptDir & "\bench.db"

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists($csvFile) Then createCSV()
    If Not FileExists($sqlFile) Then createDB()

    [/autoit] [autoit][/autoit] [autoit]

    Global $sSQliteDll = _SQLite_Startup()
    If @error Then
    ConsoleWrite("SQLite Error: SQLite.dll Can't be Loaded! Errorcode(" & @error & ")" & @CRLF)
    Exit -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Global $hDB = _SQLite_Open($sqlFile)
    If $hDB = 0 Then
    ConsoleWrite("SQLite Error: openDB File failed! Errorcode(" & @error & " / " & @extended & ")" & @CRLF)
    _exit($hdb)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    csv()
    sql_LWjoinFast("benchTable")
    sql_LWjoin("benchTable")
    sql_Fetch("benchTable")
    sql_2DArray_LWArrAdd("benchTable")
    sql_2DArray("benchTable")

    [/autoit] [autoit][/autoit] [autoit]

    _exit($hdb)

    [/autoit] [autoit][/autoit] [autoit]

    Func createCSV()
    Local $exampleData = "Spalte1,Spalte2,Spalte3,Spalte4,Spalte5,Spalte6"
    Local $temp = ""
    For $i = 1 to 3000
    $temp &= $exampleData & @CRLF
    Next
    Local $hFile = FileOpen($csvFile,2+8)
    FileWrite($hFile,StringReplace($temp,@CRLF,"",-1))
    FileClose($hFile)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func createDB()
    Local $sSQliteDll = _SQLite_Startup()
    If @error Then
    ConsoleWrite("SQLite Error: SQLite.dll Can't be Loaded! Errorcode(" & @error & ")" & @CRLF)
    Exit -1
    EndIf
    Local $hDB = _SQLite_Open($sqlFile)
    If $hDB = 0 Then
    ConsoleWrite("SQLite Error: openDB File failed! Errorcode(" & @error & " / " & @extended & ")" & @CRLF)
    _exit($hdb)
    EndIf
    Local $aCSVfile
    _FileReadToArray($csvFile,$aCSVfile)
    Local $temp

    [/autoit] [autoit][/autoit] [autoit]

    ; Tabelle erstellen
    If Not _SQLite_Exec ($hDB, "CREATE TABLE benchTable ('Spalte1' TEXT,'Spalte2' TEXT,'Spalte3' TEXT,'Spalte4' TEXT,'Spalte5' TEXT,'Spalte6' TEXT);") = $SQLITE_OK Then
    ConsoleWrite("SQLite Error: CREATE Table failed! " & _SQLite_ErrMsg () & @CRLF)
    _exit($hdb)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Tabelle füllen
    $temp = "BEGIN TRANSACTION;"
    For $i = 1 To $aCSVfile[0]
    $temp &= "INSERT INTO benchTable VALUES (" & "'" & StringReplace($aCSVfile[$i],",","','") & "');"
    Next
    $temp &= "COMMIT;"

    [/autoit] [autoit][/autoit] [autoit]

    If Not _SQLite_Exec ($hDB, $temp) = $SQLITE_OK Then
    ConsoleWrite("SQLite Error: INSERT ROW's failed! " & _SQLite_ErrMsg () & @CRLF)
    _exit($hdb)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Close($hDB)
    _SQLite_Shutdown()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func csv()
    Local $time = TimerInit()
    Local $aCSVfile
    Local $myGUI = GUICreate("",1200,800)
    _FileReadToArray($csvFile,$aCSVfile)
    Local $myList = GUICtrlCreateListView(StringReplace($aCSVfile[1],",","|"),10,10,1180,780)
    Local $a2D[UBound($aCSVfile)-1][6]
    _GUICtrlListView_BeginUpdate($myList)
    For $i=1 To UBound($aCSVfile)-1
    $temp =""
    $aSplit=StringSplit($aCSVfile[$i],",")
    For $j = 1 To UBound($aSplit)-1
    $a2D[$i-1][$j-1]=$aSplit[$j]
    $temp &= $aSplit[$j] & "|"
    Next
    GUICtrlCreateListViewItem(StringTrimRight($temp,1),$myList)
    Next
    _GUICtrlListView_EndUpdate($myList)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    ConsoleWrite("CSV-Methode Time: " & TimerDiff($time) & @CRLF)
    ;MsgBox(0,"CSV-Methode","done")
    GUIDelete($myGUI)
    Return $a2D
    endfunc

    [/autoit] [autoit][/autoit] [autoit]

    Func sql_Fetch($tablename)
    Local $time=timerinit()
    Local $hQuery, $iResultRowCount=0, $iResultColumnCount=0, $allColumNames, $aResult, $temp
    Local $myGUI = GUICreate("",1200,800)

    [/autoit] [autoit][/autoit] [autoit]

    ;getRows
    _SQLite_Query ($hDB, "SELECT count(*) FROM " & $tablename, $hQuery)
    while _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK
    $iResultRowCount = Number($aResult[0])
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; getColumns
    _SQLite_Query ($hDB, "PRAGMA table_info(" & $tablename & ")", $hQuery)
    while _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK
    $iResultColumnCount = Number($aResult[0])+1
    $allColumNames &= $aResult[1] & "|"
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;ConsoleWrite("Spalten: " & $iResultColumnCount & @CRLF & "Zeilen: " & $iResultRowCount & @CRLF)
    If $iResultRowCount < 1 Then return "ERROR: rowCount failed!"
    If $iResultColumnCount < 1 Then Return "ERROR: columnCount failed!"

    [/autoit] [autoit][/autoit] [autoit]

    Local $myList = GUICtrlCreateListView(StringTrimRight($allColumNames,1),10,10,1180,780)

    [/autoit] [autoit][/autoit] [autoit]

    ; Daten einlesen
    _SQLite_Query ( $hDB, "SELECT * FROM " & $tablename, $hQuery )
    $i = 1
    _GUICtrlListView_BeginUpdate($myList)
    ;while _SQLite_FetchData($hQuery,$aResult,False,False) = $SQLITE_OK
    while _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK
    $temp = ""
    For $j = 0 to UBound($aResult)-1
    $temp &= $aResult[$j] & "|"
    Next
    GUICtrlCreateListViewItem(StringTrimRight($temp,1),$myList)
    WEnd
    ;_SQLite_QueryFinalize($hQuery)
    _GUICtrlListView_EndUpdate($myList)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    ConsoleWrite("SQL-Fetch-Methode Time: " & TimerDiff($time) & @CRLF)
    ;MsgBox(0,"SQL-Fetch-Methode","done")
    GUIDelete($myGUI)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func sql_LWjoinFast($tablename)
    Local $time=timerinit()
    Local $hQuery, $iResultRowCount=0, $iResultColumnCount=0, $allColumNames, $aResult, $temp
    Local $myGUI = GUICreate("",1200,800)

    [/autoit] [autoit][/autoit] [autoit]

    ;getRows
    _SQLite_Query ($hDB, "SELECT count(*) FROM " & $tablename, $hQuery)
    while _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK
    $iResultRowCount = Number($aResult[0])
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; getColumns
    _SQLite_Query ($hDB, "PRAGMA table_info(" & $tablename & ")", $hQuery)
    while _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK
    $iResultColumnCount = Number($aResult[0])+1
    $allColumNames &= $aResult[1] & "|"
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;ConsoleWrite("Spalten: " & $iResultColumnCount & @CRLF & "Zeilen: " & $iResultRowCount & @CRLF)
    If $iResultRowCount < 1 Then return "ERROR: rowCount failed!"
    If $iResultColumnCount < 1 Then Return "ERROR: columnCount failed!"

    [/autoit] [autoit][/autoit] [autoit]

    $allColumNames = StringTrimRight($allColumNames,1)
    Local $myList = GUICtrlCreateListView($allColumNames,10,10,1180,780)

    [/autoit] [autoit][/autoit] [autoit]

    ; Daten einlesen
    Local $subquery="SELECT " & StringReplace($allColumNames,"|"," || '|' || ") & " AS Result FROM " & $tablename
    _SQLite_Query ( $hDB, "Select group_concat(Result) FROM (" & $subquery & ")", $hQuery )
    _GUICtrlListView_BeginUpdate($myList)
    ;$t=TimerInit()
    If _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK Then
    Local $aTemp = StringSplit($aResult[0],",")
    For $i = 1 To $aTemp[0]
    GUICtrlCreateListViewItem($aTemp[$i],$myList)
    Next
    ;ConsoleWrite(@TAB & "fetch+lwfill: " & TimerDiff($t) & @CRLF)
    Else
    ConsoleWrite("SQLite Error: Reading Table failed! Errorcode(" & @error & " / " & @extended & ")" & @CRLF)
    EndIf
    _SQLite_QueryFinalize($hQuery)
    _GUICtrlListView_EndUpdate($myList)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    ConsoleWrite("SQL-LWjoinFast-Methode Time: " & TimerDiff($time) & @CRLF)
    ;MsgBox(0,"SQL-LWjoinFast-Methode","done")
    GUIDelete($myGUI)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func sql_LWjoin($tablename)
    Local $time=timerinit()
    Local $hQuery, $iResultRowCount=0, $iResultColumnCount=0, $allColumNames, $aResult, $temp
    Local $myGUI = GUICreate("",1200,800)

    [/autoit] [autoit][/autoit] [autoit]

    ;getRows
    _SQLite_Query ($hDB, "SELECT count(*) FROM " & $tablename, $hQuery)
    while _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK
    $iResultRowCount = Number($aResult[0])
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; getColumns
    _SQLite_Query ($hDB, "PRAGMA table_info(" & $tablename & ")", $hQuery)
    while _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK
    $iResultColumnCount = Number($aResult[0])+1
    $allColumNames &= $aResult[1] & "|"
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;ConsoleWrite("Spalten: " & $iResultColumnCount & @CRLF & "Zeilen: " & $iResultRowCount & @CRLF)
    If $iResultRowCount < 1 Then return "ERROR: rowCount failed!"
    If $iResultColumnCount < 1 Then Return "ERROR: columnCount failed!"

    [/autoit] [autoit][/autoit] [autoit]

    $allColumNames = StringTrimRight($allColumNames,1)
    Local $myList = GUICtrlCreateListView($allColumNames,10,10,1180,780)

    [/autoit] [autoit][/autoit] [autoit]

    ; Daten einlesen
    _SQLite_Query ( $hDB, "SELECT " & StringReplace($allColumNames,"|"," || '|' || ") & " FROM " & $tablename, $hQuery )
    _GUICtrlListView_BeginUpdate($myList)
    ;$t=TimerInit()
    while _SQLite_FetchData($hQuery,$aResult) = $SQLITE_OK
    GUICtrlCreateListViewItem($aResult[0],$myList)
    WEnd
    ;ConsoleWrite(@TAB & "fetch+lwfill: " & TimerDiff($t) & @CRLF)
    _GUICtrlListView_EndUpdate($myList)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    ConsoleWrite("SQL-LWjoin-Methode Time: " & TimerDiff($time) & @CRLF)
    ;MsgBox(0,"SQL-LWjoin-Methode","done")
    GUIDelete($myGUI)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func sql_2DArray($tablename)
    Local $time=timerinit()
    Local $iResultRowCount=0, $iResultColumnCount=0, $allColumNames, $aResult, $temp
    Local $myGUI = GUICreate("",1200,800)

    [/autoit] [autoit][/autoit] [autoit]

    ; getColumnNames
    If Not _SQLite_GetTable2d($hDB, "PRAGMA table_info(" & $tablename & ")", $aResult, $iResultRowCount, $iResultColumnCount) = $SQLITE_OK Then
    ConsoleWrite("SQLite Error: Reading Table failed! Errorcode(" & @error & " / " & @extended & ")" & @CRLF)
    GUIDelete($myGUI)
    Return -1
    Else
    For $i=1 To UBound($aResult)-1
    $allColumNames &= $aResult[$i][1] & "|"
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $myList = GUICtrlCreateListView(StringTrimRight($allColumNames,1),10,10,1180,780)

    [/autoit] [autoit][/autoit] [autoit]

    If Not _SQLite_GetTable2d($hDB, "SELECT * FROM " & $tablename, $aResult, $iResultRowCount, $iResultColumnCount) = $SQLITE_OK Then
    ConsoleWrite("SQLite Error: Reading Table failed! Errorcode(" & @error & " / " & @extended & ")" & @CRLF)
    GUIDelete($myGUI)
    Return -1
    Else
    For $i = 1 To UBound($aResult)-1
    $temp = ""
    For $j = 0 To UBound($aResult,2)-1
    $temp &= $aResult[$i][$j] & "|"
    Next
    GUICtrlCreateListViewItem(StringTrimRight($temp,1),$myList)
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    ConsoleWrite("SQL-2DArray-Methode Time: " & TimerDiff($time) & @CRLF)
    ;MsgBox(0,"SQL-2DArray-Methode","done")
    GUIDelete($myGUI)
    Return $aResult
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func sql_2DArray_LWArrAdd($tablename)
    Local $time=timerinit()
    Local $iResultRowCount=0, $iResultColumnCount=0, $allColumNames, $aResult, $temp
    Local $myGUI = GUICreate("",1200,800)

    [/autoit] [autoit][/autoit] [autoit]

    ; getColumnNames
    If Not _SQLite_GetTable2d($hDB, "PRAGMA table_info(" & $tablename & ")", $aResult, $iResultRowCount, $iResultColumnCount) = $SQLITE_OK Then
    ConsoleWrite("SQLite Error: Reading Table failed! Errorcode(" & @error & " / " & @extended & ")" & @CRLF)
    GUIDelete($myGUI)
    Return -1
    Else
    For $i=1 To UBound($aResult)-1
    $allColumNames &= $aResult[$i][1] & "|"
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $myList = GUICtrlCreateListView(StringTrimRight($allColumNames,1),10,10,1180,780)

    [/autoit] [autoit][/autoit] [autoit]

    If Not _SQLite_GetTable2d($hDB, "SELECT * FROM " & $tablename, $aResult, $iResultRowCount, $iResultColumnCount) = $SQLITE_OK Then
    ConsoleWrite("SQLite Error: Reading Table failed! Errorcode(" & @error & " / " & @extended & ")" & @CRLF)
    GUIDelete($myGUI)
    Return -1
    Else
    _GUICtrlListView_AddArray($myList,$aResult)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    ConsoleWrite("SQL-2DArray_LWArrAdd-Methode Time: " & TimerDiff($time) & @CRLF)
    ;MsgBox(0,"SQL-2DArray_LWArrAdd-Methode","done")
    GUIDelete($myGUI)
    Return $aResult
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit($hdb)
    If $hdb <> 0 then _SQLite_Close($hDB)
    _SQLite_Shutdown()
    Exit
    EndFunc

    [/autoit]


    Die Frage:
    Woran liegts? Kann man das in irgendeinerweise noch beschleunigen? Eine Sekunde ist mir eigentlich zu lange, zumal es in den nächsten Jahren eher mehr Daten werden und die Zeit vermutlich nochmals entsprechend ansteigen dürfte. Je nach Filterung muss das Listview immer mal wieder komplett erstellt werden, was dann jeweils in einer 1-Sekunden Pause resultieren dürfte.

  • Probleme mit RunAs

    • misterspeed
    • 7. Juni 2013 um 14:14

    Lass die verwendeten Parameter am besten mal ausgeben und kontrolliere ob zum einen alle Daten stimmen und zum anderen alle Pfade die Leerzeichen enthalten mit Anführungszeichen umschlossen sind:

    [autoit]


    consolewrite("user: " & @tab & @tab & $domainuser & @crlf)
    consolewrite("domäne: " & @tab & @tab & @LogonDomain & @crlf)
    consolewrite("pw: " & @tab & @tab & $domainpass & @crlf)
    consolewrite("befehl: " & @tab & @tab & Chr(34) & $progbin & "\" & $sProcess & Chr(34) & " /A:$(#OKF" & $impfilearraysplit[1] & ")\ARCHIV/F:" & $eimport & "\" & $impfilearray[$k] & " /SHR /BAT" & @crlf)
    consolewrite("workingdir: " & @tab & @tab & @ScriptDir & "\" & $tmpdir & @crlf)

    [/autoit]

    Ich würde den String im übrigen nicht mit chr(34) aufbauen, sondern aus Bequemlichkeit und der Übersicht wegen so:

    [autoit]


    $befehl = '"' & $progbin & '\' & $sProcess & '"' & ' /A:$(#OKF' & $impfilearraysplit[1] & ')\ARCHIV/F:' & $eimport & '\' & $impfilearray[$k] & ' /SHR /BAT'

    [/autoit]

    Ich vermute mal, dass der Fehler hier schlummert, da du diesen Pfad nicht in Anführungszeichen setzt:

    [autoit]

    $teilstring = 'ARCHIV/F:' & $eimport & '\' & $impfilearray[$k]

    [/autoit]
  • Text: benötigten Speicher herausfinden

    • misterspeed
    • 6. Juni 2013 um 19:21

    Nicht zwingend, kommt auf die Codierung an. UTF benötigt z.B. teilweise mehr als 1 Byte pro Zeichen.

    EDIT: Da war chess flotter...

    Siehe auch hier:
    http://de.wikipedia.org/wiki/UTF-8

  • Vor dem Herunterfahren laufende .exe beenden

    • misterspeed
    • 6. Juni 2013 um 09:37

    Cool wusste garnicht, dass es dieses Makro gibt.

  • hilfe zu ff.au3

    • misterspeed
    • 5. Juni 2013 um 23:31

    Dass das Automatisieren eines voting systems für ein Spiel den Forenregeln entspricht bezweifle ich im übrigen noch mehr als die Automatisierung von web.de.

    Die Betreiber dieser Webseite scheinen auch nicht sonderlich von automatisierten Bots angetan zu sein:

    Zitat


    Bots/Scripte:
    Das Nutzen von Bots/Scripts zum Leveln, Farmen oder sonstigen Sachen ist verboten.

    Das hier dürfte wohl unter "Sonstige Sachen" fallen.


    Edit:

    Scheinbar ist das wohl um die Webseite auf anderen Webseiten zu pushen und offensichtlich erwünscht vom Betreiber. Dennoch halte ich das für absolute Zeitverschwendung und dem Video nach ohnehin nicht automatisierbar ohne Captchas zu knacken, was wiederum definitiv gegen die Forenregeln verstösst...

    Hier für alle die dort wie ich keinen Account haben und auch mal wissen wollen wie das abläuft:
    http://www.youtube.com/watch?v=JbF0Sk6QVf8

    Die Betreiber fordern mehr oder weniger sogar dazu auf 24h IP Blocks via Tor zu umgehen um mehr votes für die eigene Seite auf externen Webseiten zu generieren, ich finde nicht, dass wir das hier unterstützen sollten.

    http://www.wow-castle.de/bboard/143-faq…erver-voteshop2

  • "Buttontext" <> "Buttonwert"

    • misterspeed
    • 5. Juni 2013 um 09:06

    Nice. Aber wäre es im Falle von "beliebig vielen" Daten pro Control nicht einfacher/geschickter gleich "Sub-Arrays" ins globale Array zu packen? Dann sparste dir die Stringverkettung bzw. das Stringsplit. Ich hatte bei mir im Übrigen das Array an die Funktionen übergeben, damit man zum einen mehrere Datensammelarrays (z.B. für verschiedenartige Controls und schnelleren Zugriff bei sehr vielen Controls) verwenden kann und zum anderen flexibler ist was die Benennung des Arrays anbelangt, sofern man den Code in mehreren Programmen verwenden will.

  • "Buttontext" <> "Buttonwert"

    • misterspeed
    • 5. Juni 2013 um 00:03

    Der Vollständigkeit halber und zur totalen Verwirrung noch drei weitere ganz spezielle Buttons, die sogar noch dann Sinn machen wenn es keine zugehörige grafische Benutzer Schnittstelle gibt ( und nein Raupis magischer "PHP Button" ist nicht dabei :P :(

    Der Jenson Button
    Der Jim Button (der hat sogar was mit Programmierung zu tun...)

    und natürlich DER BUTTON

  • 2D-Array > wie addiert man?

    • misterspeed
    • 4. Juni 2013 um 20:47

    Erstmal wie andy schon sagte, wozu brauchst du ein 2D Array zum addieren der Werte? Das würde bestenfalls Sinn machen, wenn du die Ergebnisse nach der Berechnung weiterverwenden willst. Da du das Array aber lokal deklarierst ist das Array danach ohnehin weg. Wenn du die Ergebnisse also speichern willst brauchst du ein globales Array, welches nur einmal am Scriptanfang deklariert wird und nicht bei jedem Funktionsaufruf erneut.

    Nun zum eigentlichen Fehler:

    [autoit]


    ;...
    $Input1 = GUICtrlCreateInput("", 168, 216, 121, 21)
    $Input7 = GUICtrlCreateInput("", 296, 216, 121, 21)
    ;...
    Func _Rechne()
    Local $aiArray[2][2], $i
    Local $Zahl1, $Zahl2,$Zahl3, $Wert, $Id

    [/autoit]

    Wir halten hier mal fest, dass du die Variablen $zahl1-3, $wert und $id nur deklarierst, sie haben alle keinen Wert, was als 0 interpretiert wird. Dein Array wird mit 2x2 Feldern deklariert, es besitzt also 2 Zeilen (0 und 1) und 2 Spalten (0 und 1).
    Ansprechen müsstest du das Array folglich so:

    [autoit]


    $aiArray[0][0]="Inhalt Spalte 1, Zeile 1"
    $aiArray[0][1]="Inhalt Spalte 2, Zeile 1"
    $aiArray[1][0]="Inhalt Spalte 1, Zeile 2"
    $aiArray[1][1]="Inhalt Spalte 2, Zeile 2"

    [/autoit]

    Jetzt machst du das hier:

    [autoit]


    $aiArray [$Zahl1][$Id] = $Input1
    $aiArray [$Zahl2][$Id] = $Input7

    [/autoit]

    Da $zahl1-2 und $id alle 0 sind änderst du zweimal hintereinander den Inhalt von $aiArray[0][0], die anderen 3 Datenfelder des Arrays sind leer.
    Richtig wäre also eher das:

    [autoit]


    $aiArray [0][0] = $Input1
    $aiArray [1][0] = $Input7

    [/autoit]

    Das sorgt dafür, dass beide Control IDs in der jeweils ersten Spalte gespeichert sind. Das so zu tun ist ggf. sinnvoll, aber wie anfangs erwähnt sollte das global passieren und zwar dann wenn du die Controls erstellst.

    [autoit]


    ; Werte speichern
    $aiArray[$Zahl1][$Wert] = Number(GUICtrlRead($Input1))
    $aiArray[$Zahl2][$Wert] = Number(GUICtrlRead($Input7))

    [/autoit]

    Hier haben deine Variablen $zahl1-2 und $wert immer noch den Wert 0, also änderst du erneut das Feld $aiArray[0][0] zweimal hintereinander, deine alten Werte existieren somit nicht mehr. Gehen wir mal davon aus, dass du es wie oben von mir vorgeschlagen machst, dann müsste das ganze so lauten:

    [autoit]


    $aiArray[0][1] = Number(GUICtrlRead($Input1))
    $aiArray[1][1] = Number(GUICtrlRead($Input7))

    [/autoit]

    Das sorgt nun dafür, dass du die Inhalte der beiden Textfelder in die 2. Spalte deines Arrays speicherst. Das fertige Array schaut nun so aus:

    Code
    Zeile1: ID Control1 | Inhalt von Control 1
    Zeile2: ID Control2 | Inhalt von Control 2

    Deine Rechnung:

    [autoit]


    $aiArray[$Zahl3][$Wert] = Number($aiArray[$Zahl1][$Wert]) + Number($aiArray[$Zahl2][$Wert])

    [/autoit]

    Der selbe Fehler wie schon die anderen Male, du verwendes die nicht gesetzten Variablen und sprichst daher immer das selbe Feld im Array an, du erhälst also immer das selbe Ergebnis. Konkret wird folgendes passieren, angenommen du gibst ins Textfeld 2 den Wert 100 ein, dann hast du nun im angesprochenen Array Feld den Wert 100 stehen, diesen liest du zweimal aus und erhälst die Summe 200, welche dann im selben Feld gespeichert wird. Der Inhalt von Textfeld 1 wird immer in der jeweils 2. Zeile überschrieben, somit ist er längst nicht mehr vorhanden. (siehe oben).

    Richtig wäre also, sofern du meine Änderungen befolgt hast:

    [autoit]


    $summe = $aiArray[0]1] + $aiArray[1]1]

    [/autoit]

    Da du garkeinen Platz mehr im Array hast kannst du diese Summe auch nirgendwo mehr speichern. Du müsstest wenn schon noch eine dritte Zeile ins Array packen in der das Ergebnis dann gespeichert werden kann.

    Nun nochmal zum Sinn oder Unsinn das alles mit einem Array zu machen:

    [autoit]


    Func _Rechne()
    $summe = number(guictrlread($input1))+number(guictrlread($input7))
    MsgBox(1,"Ergebnis", "Ergebnis beträgt " & $summe &" !")
    EndFunc

    [/autoit]

    Das würde völlig ausreichen. Die Nutzung von Arrays würde bestenfalls Sinn ergeben, wenn du sehr viele Controls hast die aufaddiert werden sollen oder eine nicht genau bestimmte Anzahl an Controls dynamisch erstellen musst.


    EDIT: Da hab ich wohl zulange getippt...

  • "Buttontext" <> "Buttonwert"

    • misterspeed
    • 4. Juni 2013 um 18:27

    Ich könnte jetzt noch den Begriff "GUI" genauer definieren, aber lassen wir das... darum gings hier ja letzlich auch nicht. Ich denke hier wurde alles nötige gesagt und wir wissen beide, was der Threadersteller haben wollte, was mit Autoit und meinetwegen auch mit der WinAPI nativ möglich ist und was nicht.

    PS: Dass du keinen Plan hast nimmt dir eh keiner ab. :P

  • "Buttontext" <> "Buttonwert"

    • misterspeed
    • 4. Juni 2013 um 18:00
    Zitat von Raupi

    Ein Button ist ein WinApi Control

    Nö, das hängt wiederum von der verwendeten (Programmier)sprache ab. *Klugscheiß*

  • Sicherheitsattribut von Dateien auslesen/ändern

    • misterspeed
    • 4. Juni 2013 um 17:54

    Da das ganze nicht in der Datei, sondern viel mehr im Dateisystem oder einer DB (smartscreen filter) gespeichert wird kann man das sehr simpel austricksen:

    [autoit]


    $filename = @ScriptDir & "\test.exe"

    [/autoit][autoit][/autoit][autoit]

    $hFile = FileOpen($filename,16)
    $bdata = FileRead($hFile)
    FileClose($hFile)
    FileDelete($filename)

    [/autoit][autoit][/autoit][autoit]

    $hFile=FileOpen($filename,2+8+16)
    FileWrite($hFile,$bdata)
    FileClose($hFile)

    [/autoit]

    Einfach einlesen, löschen und in neue Datei schreiben, schon ist der Schutz umgangen. Bei mir haben ausführbare Dateien aber nur dann diese Eigenschaft, wenn sie mit dem IE heruntergeladen wurden. Verwendet man Firefox oder inetget für den Download wird bei mir nichts beanstandet.

  • "Buttontext" <> "Buttonwert"

    • misterspeed
    • 4. Juni 2013 um 12:56

    Wie schon gesagt wurde gibt es in Autoit nicht das Prinzip, dass ein Button neben dem Anzeigetext noch ein unabhängiges frei definierbares value Attribut besitzt. Man kann sowas aber nachbilden wenn man meint es wäre sinnvoll, ich sehe aber nicht wirklich einen Sinn dahinter. Im Beispiel unten ist es möglich erweiterte Buttons zu erzeugen, welche einen Text und einen Wert haben, beides kann unabhängig voneinander geändert werden. Prinzipiell könnte man das auch erweitern und mehrere "Value" Spalten hinzufügen, so dass ein Button sogar unendlich viele einzeln änderbare Werte haben könnte.


    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    global $aExtendedButton[1][3]=[["id","text","value"]]

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate("TestGUI", 615, 438, 192, 124)
    $myButton_1 = createExtendedButton($aExtendedButton,"Wert1","Text1", 20, 30, 100, 50)
    $myButton_2 = createExtendedButton($aExtendedButton,"Wert2","Text2", 220, 30, 100, 50)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $myButton_1, $myButton_2
    MsgBox(0,"DebugInfo", "Alter Text: " & getExtendedButtonInfoByID($aExtendedButton,$nMsg,"text") & @CRLF & _
    "Alter Wert: " & getExtendedButtonInfoByID($aExtendedButton,$nMsg,"value"))
    $neuerText = InputBox("DebugTest: setNewText","Bitte neuen Button Text eingeben")
    $neuerWert = InputBox("DebugTest: setNewValue","Bitte neuen Button Wert eingeben")
    setExtendedButtonInfoByID($aExtendedButton,$nMsg,"text",$neuerText)
    setExtendedButtonInfoByID($aExtendedButton,$nMsg,"value",$neuerWert)
    MsgBox(0,"DebugInfo", "Neuer Text: " & getExtendedButtonInfoByID($aExtendedButton,$nMsg,"text") & @CRLF & _
    "Neuer Wert: " & getExtendedButtonInfoByID($aExtendedButton,$nMsg,"value"))
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func createExtendedButton(ByRef $aButton,$value="", $text = "", $left=-1, $top=-1, $width = Default, $height = Default, $style = Default, $exStyle = Default )
    if not isarray($aButton) then
    consolewrite("Error: Es wurde kein Array angegeben" & @CRLF)
    return
    else
    redim $aButton[ubound($abutton)+1][3]
    endif

    [/autoit] [autoit][/autoit] [autoit]

    if $value = "" then $value = $text

    [/autoit] [autoit][/autoit] [autoit]

    $aButton[ubound($aButton)-1][0]=GUICtrlCreateButton($text, $left, $top, $width, $height,$style,$exStyle)
    $aButton[ubound($aButton)-1][1]=$text
    $aButton[ubound($aButton)-1][2]=$value

    [/autoit] [autoit][/autoit] [autoit]

    return $aButton[ubound($aButton)-1][0]
    endfunc

    [/autoit] [autoit][/autoit] [autoit]

    func getExtendedButtonInfoByID(ByRef $aButton, $searchId, $infoItem)
    Local $column = -1
    if not isarray($aButton) then
    consolewrite("Error: Es wurde kein Array angegeben" & @CRLF)
    return
    endif

    [/autoit] [autoit][/autoit] [autoit]

    $id = _arraySearch($aButton,$searchID,1)

    [/autoit] [autoit][/autoit] [autoit]

    if $id = -1 then
    consolewrite("Error: Button ID not found" & @CRLF)
    return
    endif

    [/autoit] [autoit][/autoit] [autoit]

    if $InfoItem = "text" then $column = 1
    if $InfoItem = "value" then $column = 2

    [/autoit] [autoit][/autoit] [autoit]

    if $column = -1 then
    consolewrite("Error: Ungültiges InfoItem" & @CRLF)
    return
    endif
    return $aButton[$id][$column]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func setExtendedButtonInfoByID(ByRef $aButton, $searchId, $infoItem,$newItemInfo)
    Local $column = -1
    if not isarray($aButton) then
    consolewrite("Error: Es wurde kein Array angegeben" & @CRLF)
    return
    endif

    [/autoit] [autoit][/autoit] [autoit]

    $id = _arraySearch($aButton,$searchID,1)

    [/autoit] [autoit][/autoit] [autoit]

    if $id = -1 then
    consolewrite("Error: Button ID not found" & @CRLF)
    return
    endif

    [/autoit] [autoit][/autoit] [autoit]

    if $InfoItem = "text" then $column = 1
    if $InfoItem = "value" then $column = 2

    [/autoit] [autoit][/autoit] [autoit]

    if $column = -1 then
    consolewrite("Error: Ungültiges InfoItem" & @CRLF)
    return
    endif

    [/autoit] [autoit][/autoit] [autoit]

    $aButton[$id][$column]=$newItemInfo
    if $column = 1 then guictrlsetData($searchID,$newItemInfo)
    endFunc

    [/autoit]
  • _MSSQL_Query von der UDF MSSQL.au3 (von TheLuBu) liefert kein Ergebnis

    • misterspeed
    • 3. Juni 2013 um 19:59

    Für einfache selects hat er doch extra diese Funktion vorgesehen:

    [autoit]


    Func _MSSQL_GetRecord($oConnectionObj, $sTable, $Columns = "*", $condition = "", $order = "")

    [/autoit]

    Die gibt dir dann auch gleich ein Array mit allen Ergebnissen des Querys zurück. Letzlich macht die Funktion so ziemlich das selbe wie du nun von hand.

    Die Funktion _MSSQL_Query() ist eher für andere SQL Befehle gedacht, wie z.B. aufwendigere und verschachtelte Select Anfragen, der Aufruf oder die Erstellung einer stored function, create view, oder auch um Berechtigungen zu setzen. Eben alles was man mit den anderen bereitgestellten Funktionen der UDF nicht tun kann.

  • disable local inputs

    • misterspeed
    • 2. Juni 2013 um 20:34

    Nix gegen Basteln, aber ich kann mir schon kaum einen Grund vorstellen warum man beides temporär deaktivieren wollen würde, aber permanent durch abziehen der internen Verkabelung halte ich mal für total unsinnig. So wie ich das verstanden habe sucht er schlichtweg eine softwarebasierte Lösung fürs temporäre Abschalten der Geräte. Und das sollte wie oben beschrieben kein Problem darstellen bzw. machbar sein.

    Hier mal ein paar Links, falls man das selbst realisieren will anstatt "devcon" dafür zu verwenden:

    http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
    http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx

    Übersteigt mein Wissen allerdings ein wenig und ganz ungefährlich ist es mit Sicherheit auch nicht damit rumzuspielen.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™