Archiv der Kategorie: Programmierung

Von Microsoft Excel in den Microsoft SQL Server importieren

Dies ist ein VBA Skript um Dateien von einer Excel-Tabelle in den Microsoft SQL Server zu importieren. Bevor das Skript läuft muss im VBA-Editor unter Extras -> Verweise „Microsoft ActiveX Data Objects“ als Bibliothek ausgewählt werden, damit ADODB.* zur Verfügung steht.

Private Sub CommandButton1_Click()
    ' Die Datenbankverbindung
    Dim Cn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim letzteZeile As Integer
    Dim i As Integer
    
    ' Die beiden Felder material, prdha
    Dim materialnr As String
    Dim prdha As String
    
    ' Finde die letzte Zeile
    letzteZeile = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row + 1
    
    ' Provider OLEDB Provider
    Cn.Provider = "SQLOLEDB.1"
    
    ' Connectionstring
    Cn.ConnectionString = "Password=meinpasswort;" & _
    "Persist Security Info=True;" & _
    "User ID=meinuser;" & _
    "Initial Catalog=meinedatenbank;" & _
    "Data Source=SERERNAMEODERIPADRESSE"
    
    ' Verbindung öffnen
    Cn.Open
            
    For i = 1 To letzteZeile
        materialnr = Tabelle1.Cells(i, 1)
        prdha = Tabelle1.Cells(i, 2)
        Cn.Execute ("INSERT INTO prdha(material, prdha) " & _
                         "VALUES('" + materialnr + "','" + prdha + "')")
    Next i
    
    ' Verbindung schließen
    Cn.Close
    
End Sub

Security Event Log auslesen bei Microsoft Windows Server

Das nachfolgende Konsolenprogramm gibt eine Liste des Security Event Logs beim Windows Server aus. Hier sieht man welche Person zu welchem Zeitpunkt eine Windows-Authentifizierung über eine Windows/ASP.NET-Anwendung am IIS Server getan hat.

namespace APITester
{
class Program
{
static void Main(string[] args)
{
EventLog test = new EventLog();
test.Log = „Security“;

for (int i = 0; i < test.Entries.Count; i++) { try { Console.WriteLine(test.Entries[i].TimeGenerated + " " + test.Entries[i].UserName); } catch (Exception e) { } } Console.ReadLine(); } } }[/javascript]

Zugriff von VBA auf Microsoft SQL Server

Zunächst wird (z.B. in Excel) im VBA-Editor im Menü „Verweise“ der Verweis „Microsoft ActiveX data Object“ hinzugefügt, damit man Zugriff auf die ADO-Klassen bekommt.

Private Sub CommandButton1_Click()
    Dim Cn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    
    Cn.Provider = "SQLOLEDB.1"
    
    Cn.ConnectionString = "Password=daspasswort;" & _
    "Persist Security Info=True;" & _
    "User ID=deruser;" & _
    "Initial Catalog=datenbankname;" & _
    "Data Source=rechnername"
    
    Cn.Open
    
    Rs.CursorType = adOpenKeyset
    Rs.LockType = adLockPessimistic
    Rs.Open "SELECT TOP 10 * FROM globe2010juni_converted", Cn, adOpenStatic
   
    Do Until Rs.EOF
      Debug.Print Rs.Fields("compcode").Value
      Rs.MoveNext
    Loop
   
    Cn.Close
End Sub

FluorineFX RTMP/Messaging konfigurieren

In einer Microsoft IIS Umgebung greift der Flex-Entwickler auf die kostenlose Middleware FluorineFX zurück. Hier gibt es 4 wichtige Dateien, die für die Konfiguration des Frameworks zuständig sind.

  • data-management-config.xml
  • messaging-config.xml
  • remoting-config.xml
  • services-config.xml

Dem Java-Entwickler sind diese Dateien ebenfalls aus der Java-Bibliothek BlazeDS bekannt.

Bei einem Kompiliervorgang wird die Datei services-config.xml in den Compilersettings angegeben.
[Rechtsklick auf Projekt in Workspace -> Properties -> Flex Compiler -> Additional compiler arguments]

-locale en_US -services services-config.xml -context-root /

Es gibt die Möglichkeit einen direkten Pfad mit einer Netzwerkfreigabe auf die services-config.xml des IIS-Servers anzugeben oder diese Datei lokal zu kopieren und die URL’s

  • RTMP – Real Time Messaging Protocol – was für Messaging benötigt wird und..
  • die normalen AMF Services (Actionscript Messaging Format – dient lediglich der RPC-Kommunikation wie GWT RPC oder SOAP Webservices, hierauf wird in diesem Artikel nicht eingegangen)

anzupassen. Hierbei kann man eine absolute Pfadangabe machen, wenn man den IIS nicht lokal auf dem Entwicklerrechner installiert hat (dies ist das Vorgehen in diesem Artikel). Auf dem Server, auf dem sich redundant (in der deployten FluorineFX-Anwendung im WEB-INF-Verzeichnis) diese Dateien befinden, werden allerdings entgegen den nachfolgenden Beispielen anstelle der absoluten Pfade die Platzhalter rtmp://{server.name}:2037 und http://{server.name}:{server.port}/{context.root}/Gateway.aspx verwendet.

services-config.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<services-config>
    <services>
      <service-include file-path="remoting-config.xml" />
      <service-include file-path="messaging-config.xml" />
    </services>
       
    <channels>
        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
	        <endpoint uri="http://rechner3j.asag.asap.com:4321/Gateway.aspx" 
                 class="flex.messaging.endpoints.AMFEndpoint"/> 
        </channel-definition>

        <channel-definition id="my-rtmp" class="mx.messaging.channels.RTMPChannel">
            <endpoint uri="rtmp://rechner3j.asag.asap.com:2037" 
             class="flex.messaging.endpoints.RTMPEndpoint"/>
            <properties>
                <idle-timeout-minutes>0</idle-timeout-minutes>
            </properties>
        </channel-definition>

    </channels>
</services-config>

remoting-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" class="flex.messaging.services.RemotingService" 
 messageTypes="flex.messaging.messages.RemotingMessage">
    <adapters>
        <adapter-definition id="dotnet" class="FluorineFx.Remoting.RemotingAdapter" 
	default="true"/>
    </adapters>

    <0default-channels>
        <channel ref="my-amf"/>
    </default-channels>

  <destination id="GenericDestination">
    <properties>
      <source>*</source>
    </properties>
  </destination>  

  <destination id="fluorine">
    <properties>
       <source>*</source>
    </properties>      
  </destination>
</service>

messaging-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<service id="message-service" class="flex.messaging.services.MessageService" 
 messageTypes="flex.messaging.messages.AsyncMessage">
     <!-- DO NOT CHANGE <adapters> SECTION-->
    <adapters>
	<adapter-definition id="messagingAdapter" 
        class="FluorineFx.Messaging.Services.Messaging.MessagingAdapter" 
        default="true"/>
    </adapters>

    <destination id="chat">
		<adapter ref="messagingAdapter"/>
    	<properties>
	        <network>
            	<session-timeout>0</session-timeout>
        	</network>
    	</properties>
    	<channels>
         	<channel ref="my-rtmp"/>
    	</channels>
    </destination>
</service>

FluorineFX geht folgendermaßen vor:
Sobald die Server-Seite (also nicht die Dateien mit den absoluten Pfaden wie obenstehend) mit der Definition für einen RTMP-Channel versehen wurde, wird ein Treffer auf einer beliebigen ASPX-Seite innerhalb der FluorineFX-Webanwendung dazu führen, das ein Socket auf dem definierten Port gestartet wird (oben wäre dass dann Port 2037 für RTMP). Ob es funktioniert hat, lässt sich mit einem telnet-Login prüfen. Hierzu einfach mal in der Eingabeaufforderung (CMD)

telnet hostname 2037

eingeben. Sollte der RTMP-Server nicht laufen, bitte mal auf dem Server per Remotekonsole einloggen und in der Eingabeaufforderung mit

telnet 127.0.0.1 2037

den Login versuchen.
Der Login funktioniert, wenn der Bildschirm gelöscht wird und ein Cursor in der Ecke links oben steht. Dieser Modus kann meistens mit STRG+C abgebrochen werden, sollte dies nicht funktionieren kann man auch die Eingabeaufforderung schließen.

Wichtig!!! Damit sie die Flex-Anwendung überhaupt mit der Messaging-Funktionalität und den obengenannten Konfigurationsdateien kompilieren können benötigen sie 2 Dateien, die sie in der Installation der Adobe Livecycle Services (LSDS) finden.

  • fds_rb.swc
  • fds.swc

Sie müssen einen Account bei Adobe registrieren und die LCDS runterladen, anschließend kopieren sie die o.g. Dateien in das LIB-Verzeichnis ihrer Flex-Anwendung und es kompiliert!!! Glückwunsch. So nun ein kleines Beispiel für einen gut funktionierenden Chat:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application creationComplete="{creationComplete()}" 
    xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Script>
	<![CDATA[
	    import mx.controls.Alert;
	    import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
    	    import mx.messaging.*;
    	    import mx.messaging.messages.*;
    	    import mx.messaging.events.*;
    	    import mx.core.Application; 
    		
    	    public function creationComplete():void
    	    {
    		consumer.subscribe();
    	    }
   
            private function messageHandler(event:MessageEvent):void
            {
    		txtLog.text += event.message.body.toString()+'\r';
    	    }
   
            private function messagefaultHandler(event:MessageFaultEvent):void
    	    { 
        	Alert.show(event.faultString, "Error"); 
    	    }
   
            public function sendMessage():void
	    {
        	var message:AsyncMessage = new AsyncMessage();
       		message.body = txtOutput.text;
       		producer.send(message);
       		txtOutput.text="";
    	    }
	]]>
       </mx:Script>
       <mx:Consumer id="consumer" destination="chat" 
	   message="messageHandler(event)" fault="messagefaultHandler(event)"/>
       <mx:Producer id="producer" destination="chat" fault="messagefaultHandler(event)"/>
       <mx:VBox width="100%" height="100%">
    	
       <mx:HBox width="100%">
         <mx:TextInput width="100%" id="txtOutput"/>
         <mx:Button label="Skicka" click="sendMessage()"/>
       </mx:HBox>
    	<mx:TextArea height="100%" width="100%" editable="true" id="txtLog"/>
    </mx:VBox>
</mx:Application>