<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="de-de" xmlns="http://www.w3.org/2005/Atom">
  <title>Freakfabrik Softwareschmiede - Das Blog</title>
  <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/" />
  <link rel="self" href="http://blog.freakfabrik.net/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2007-01-15T16:36:26.9425048+01:00</updated>
  <author>
    <name>Peter Becker (Floyd)</name>
  </author>
  <subtitle>newtelligence powered</subtitle>
  <id>http://blog.freakfabrik.net/</id>
  <generator uri="http://www.dasblog.net" version="1.9.6264.0">DasBlog</generator>
  <entry>
    <title>Fehler: 800a0e78</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=564deeae-7842-400c-872f-ba2093d0a69d" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=564deeae-7842-400c-872f-ba2093d0a69d</id>
    <published>2007-01-15T16:18:54.704+01:00</published>
    <updated>2007-01-15T16:36:26.9425048+01:00</updated>
    <category term="Fehler und L&amp;#246;sungen" label="Fehler und L&amp;#246;sungen" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Fehler+und+L%c3%b6sungen" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Fehlercode:<br />
    800a0e78<br /><br />
Fehlermeldung:<br /><br /><font color="#ff0000">    The operation requested by the application
is not allowed if the object is closed.<br />
    ADODB.Recordset Fehler "800a0e78' - Der Vorgang ist für ein geschlossenes
Objekt nicht zugelassen.</font><br /><br />
Ursache:<br /><br />
[code]sql = "Insert into #Tabelle [..]" &amp; vbcrlf &amp; _<br />
       "Select * from #Tabelle"<br />
db.execute(sql)[/code]<br /><br />
Das Problem ist das hier zwei Statements nacheinandere abgearbeitet werden womit ADODB
leider nicht so klar kommt wie man es erwarten würde. Genauer betrachtet macht ADODB
genau das was es soll. Es liefert 2 Recordsets zurück. Das erste behandelt den das
erste Statement was nach seiner Ausfühung ohne Rückgabe gleich wieder geschlossen
wurde.<br /><br />
Lösung:<br /><br />
    Ansatz 1: Man führt einfach beide Anweisungen sperat aus.<br />
    Ansatz 2: Ein "SET NOCOUNT ON" als erste Anweisung behebt ebenfalls
das Problem.<br />
       
<br /><br /><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=564deeae-7842-400c-872f-ba2093d0a69d" /></div>
    </content>
  </entry>
  <entry>
    <title>MD5sum kompatible Hash-Werte erzeugen</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=98d72a5b-cf4b-4c06-9381-5823b9590669" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=98d72a5b-cf4b-4c06-9381-5823b9590669</id>
    <published>2007-01-12T11:16:05.6943621+01:00</published>
    <updated>2007-01-12T11:16:05.6943621+01:00</updated>
    <category term="Quellcode / .Net Framework 2.0" label="Quellcode / .Net Framework 2.0" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+.Net+Framework+2.0" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Ein Freund von mir bat mich für ihn eine
Klasse zu schrieben mit der man MD5-Hash von Files erzeugen kann. Da er noch nicht
viel Erfahrung mit .Net hat willigte ich ein. Dabei stellte ich jedoch fest das es
viele verschiedene Ansätze gibt die jeweils unterschiedliche Resultate erzeugten.
Also erzeugte ich mit dem Tool <i>MD5sum.exe</i> ein paar Referenzwerte um meine Ergebnisse
zu vergleichen.<br /><br />
[code]<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs16 \cf2 Imports\cf0  System.Security.Cryptography\par ??\cf2 Imports\cf0  System.Text\par ??\cf2 Imports\cf0  System.IO\par ??\par ??\cf2 Public\cf0  \cf2 Class\cf0  MD5FileHash\par ??    \cf2 Public\cf0  \cf2 Function\cf0  getMD5HashForFile(\cf2 ByVal\cf0  strFileName \cf2 As\cf0  \cf2 String\cf0 ) \cf2 As\cf0  \cf2 String\par ??\cf0         \cf2 If\cf0  (\cf2 New\cf0  FileInfo(strFileName).Exists) \cf2 Then\par ??\cf0             \cf2 Dim\cf0  objSB \cf2 As\cf0  \cf2 New\cf0  StringBuilder\par ??            \cf2 Dim\cf0  objMD5 \cf2 As\cf0  \cf2 New\cf0  MD5CryptoServiceProvider\par ??            \cf2 Dim\cf0  objFS \cf2 As\cf0  \cf2 New\cf0  FileStream(strFileName, FileMode.Open)\par ??            \cf2 Dim\cf0  bHash() \cf2 As\cf0  \cf2 Byte\cf0  = objMD5.ComputeHash(objFS)\par ??            objFS.Close()\par ??            \cf2 For\cf0  \cf2 Each\cf0  bHex \cf2 As\cf0  \cf2 Byte\cf0  \cf2 In\cf0  bHash\par ??                objSB.Append(bHex.ToString(\cf13 "x2"\cf0 ))\par ??            \cf2 Next\par ??\cf0             \cf2 Return\cf0  objSB.ToString\par ??        \cf2 Else\par ??\cf0             \cf2 Throw\cf0  \cf2 New\cf0  FileNotFoundException(\cf13 "File "\cf0  &amp; strFileName &amp; \cf13 " not Found."\cf0 )\par ??            \cf2 Return\cf0  \cf2 Nothing\par ??\cf0         \cf2 End\cf0  \cf2 If\par ??\cf0     \cf2 End\cf0  \cf2 Function\par ??End\cf0  \cf2 Class}
--><div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 8pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    1</span> <span style="color: blue;">Imports</span> System.Security.Cryptography
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    2</span> <span style="color: blue;">Imports</span> System.Text
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    3</span> <span style="color: blue;">Imports</span> System.IO
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    4</span> 
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    5</span> <span style="color: blue;">Public</span><span style="color: blue;">Class</span> MD5FileHash
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    6</span>     <span style="color: blue;">Public</span><span style="color: blue;">Function</span> getMD5HashForFile(<span style="color: blue;">ByVal</span> strFileName <span style="color: blue;">As</span><span style="color: blue;">String</span>) <span style="color: blue;">As</span><span style="color: blue;">String</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    7</span>    
    <span style="color: blue;">If</span> (<span style="color: blue;">New</span> FileInfo(strFileName).Exists) <span style="color: blue;">Then</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    8</span>    
        <span style="color: blue;">Dim</span> objSB <span style="color: blue;">As</span><span style="color: blue;">New</span> StringBuilder
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    9</span>    
        <span style="color: blue;">Dim</span> objMD5 <span style="color: blue;">As</span><span style="color: blue;">New</span> MD5CryptoServiceProvider
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   10</span>    
        <span style="color: blue;">Dim</span> objFS <span style="color: blue;">As</span><span style="color: blue;">New</span> FileStream(strFileName,
FileMode.Open)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   11</span>    
        <span style="color: blue;">Dim</span> bHash() <span style="color: blue;">As</span><span style="color: blue;">Byte</span> =
objMD5.ComputeHash(objFS)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   12</span>    
        objFS.Close()
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   13</span>    
        <span style="color: blue;">For</span><span style="color: blue;">Each</span> bHex <span style="color: blue;">As</span><span style="color: blue;">Byte</span><span style="color: blue;">In</span> bHash
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   14</span>    
            objSB.Append(bHex.ToString(<span style="color: maroon;">"x2"</span>))
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   15</span>    
        <span style="color: blue;">Next</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   16</span>    
        <span style="color: blue;">Return</span> objSB.ToString
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   17</span>    
    <span style="color: blue;">Else</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   18</span>    
        <span style="color: blue;">Throw</span><span style="color: blue;">New</span> FileNotFoundException(<span style="color: maroon;">"File
"</span> &amp; strFileName &amp; <span style="color: maroon;">" not Found."</span>)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   19</span>    
        <span style="color: blue;">Return</span><span style="color: blue;">Nothing</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   20</span>    
    <span style="color: blue;">End</span><span style="color: blue;">If</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   21</span>     <span style="color: blue;">End</span><span style="color: blue;">Function</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   22</span> <span style="color: blue;">End</span><span style="color: blue;">Class</span></p></div>
[/code]<br /><br />
Wichtig ist das die Referenz auf <u>System.Security</u> bestehen muss. Diese Funktion
erzeugt MD5-Hash-Werte von Dateien die unter anderem zu den Hash-Werten von <a href="http://www.etree.org/md5com.html">MD5sum.exe</a>, <a href="http://digestit.kennethballard.com/download.html">digestIT</a> und
der <a href="http://mdhashtool.mozdev.org/installation.html">MD Hash Tool extension
for Firefox</a> kompatibel sind.<br /><p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=98d72a5b-cf4b-4c06-9381-5823b9590669" /></div>
    </content>
  </entry>
  <entry>
    <title>Acrobat-Version mittels JavaScript  im Internetexplorer auslesen</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=81f4642a-a663-490c-988d-c2d561e75593" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=81f4642a-a663-490c-988d-c2d561e75593</id>
    <published>2007-01-11T16:56:19.0250502+01:00</published>
    <updated>2007-01-11T16:56:19.0250502+01:00</updated>
    <category term="Quellcode / JavaScript" label="Quellcode / JavaScript" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+JavaScript" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Und zugleich erfolgt der zweite Blogeintrag
für Heute. Diesmal befasse ich mich mit dem Problem die Version des Acrobat's respektive
Acrobat Reader's im Internetexplorer auszulesen.<br /><br />
Das kniflige dabei ist das ich nicht VBScript zurückgreifen möchte. Das hat eine einfachen
Grund. Die viele Benutzer haben VBScript deaktiviert oder auf "Eingabeaufforderung"
gestellt was zu einem nervigen PopUp führen würde.<br /><br />
[code]<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs16 \cf2 function\cf0  getAcrobatVersionsNr(style)\{ \cf11 //Parameters Accept: short (Return X.X) | long (Return X.X.X) || Returns is none Acrobat detectet NULL\par ??\cf0     document.write(\cf13 '&lt;object id="pdfObj" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" width="0" height="0" style="display:none"&gt;&lt;/object&gt;'\cf0 );\par ??    \cf2 try\cf0 \{\par ??        AcrobatVersion = pdfObj.GetVersions();\par ??        \cf2 if\cf0 (AcrobatVersion == \cf13 ''\cf0 )\par ??            \cf2 return\cf0  \cf2 null\cf0 ;\par ??        \cf2 else\cf0 \{\par ??            \cf2 var\cf0  indice = AcrobatVersion.indexOf(\cf13 "AcroForm"\cf0 );\par ??            \cf2 if\cf0  (indice&gt;-1) \{\par ??                indice = indice + 9;\par ??                \cf2 var\cf0  AcrobatVersionNrLang = AcrobatVersion.substring(indice, indice + 5)\par ??                indice=AcrobatVersionNrLang.lastIndexOf(\cf13 "."\cf0 )\par ??                AcrobatVersionNrKurz = AcrobatVersionNrLang.substring(0,indice);\par ??                \cf2 if\cf0  (style==\cf13 'short'\cf0 )\par ??                    \cf2 return\cf0  AcrobatVersionNrKurz;\par ??                \cf2 else\cf0  \cf2 if\cf0  (style==\cf13 'long'\cf0 )\par ??                    \cf2 return\cf0  AcrobatVersionNrLang;\par ??            \}\par ??            \cf2 else\cf0  \par ??                \cf2 return\cf0  \cf2 null\par ??\cf0                 \par ??        \}\par ??    \}\par ??    \cf2 catch\cf0 (ex)\{\cf2 return\cf0  \cf2 null\cf0 \}\par ??\}}
--><div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 8pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    1</span> <span style="color: blue;">function</span> getAcrobatVersionsNr(style){ <span style="color: green;">//Parameters
Accept: short (Return X.X) | long (Return X.X.X) || Returns is none Acrobat detectet
NULL</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    2</span>    
document.write(<span style="color: maroon;">'&lt;object id="pdfObj" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000"
width="0" height="0" style="display:none"&gt;&lt;/object&gt;'</span>);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    3</span>     <span style="color: blue;">try</span>{
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    4</span>    
    AcrobatVersion = pdfObj.GetVersions();
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    5</span>    
    <span style="color: blue;">if</span>(AcrobatVersion == <span style="color: maroon;">''</span>)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    6</span>    
        <span style="color: blue;">return</span><span style="color: blue;">null</span>;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    7</span>    
    <span style="color: blue;">else</span>{
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    8</span>    
        <span style="color: blue;">var</span> indice
= AcrobatVersion.indexOf(<span style="color: maroon;">"AcroForm"</span>);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    9</span>    
        <span style="color: blue;">if</span> (indice&gt;-1)
{
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   10</span>    
            indice = indice + 9;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   11</span>    
            <span style="color: blue;">var</span> AcrobatVersionNrLang
= AcrobatVersion.substring(indice, indice + 5)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   12</span>    
            indice=AcrobatVersionNrLang.lastIndexOf(<span style="color: maroon;">"."</span>)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   13</span>    
            AcrobatVersionNrKurz = AcrobatVersionNrLang.substring(0,indice);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   14</span>    
            <span style="color: blue;">if</span> (style==<span style="color: maroon;">'short'</span>)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   15</span>    
                <span style="color: blue;">return</span> AcrobatVersionNrKurz;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   16</span>    
            <span style="color: blue;">else</span><span style="color: blue;">if</span> (style==<span style="color: maroon;">'long'</span>)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   17</span>    
                <span style="color: blue;">return</span> AcrobatVersionNrLang;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   18</span>    
        }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   19</span>    
        <span style="color: blue;">else</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   20</span>    
            <span style="color: blue;">return</span><span style="color: blue;">null</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   21</span> 
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   22</span>    
    }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   23</span>    
}
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   24</span>     <span style="color: blue;">catch</span>(ex){<span style="color: blue;">return</span><span style="color: blue;">null</span>}
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   25</span> }
</p></div>
[/code]<br /><br />
Die Funktion <i>getAcrobatVersionsNr</i> erstellt ein neues Objekt der angegebenen
classid welches das AcrobatBowserHelper-Objekt representatiert. Anschließend wird
geprüft ob sich dieses Objekt instanzieren ließe und wenn ja wird die Funktion <i>GetVersions </i>aufgerufen
welche einen String mit allen installierten AcrobatPlugins und deren Versionen auflistet.
Das wichtigste Plugin in diesem Zusammenhang ist <i>AcroForm</i>. Nun wird die Versionsinformation
dieses Plugins rausgeparst.<br /><br />
Die Funktion verfügt über einen Parameter der angibt in welchem Format die Rückgabe
erfolgen soll. Zur Auswahl stehen hier "short" und "long". Weitere Informationen entnehmen
Sie bitte dem Kommentar.<br /><br />
Sollte keine Acrobatversion installiert sein wird <i>NULL</i> zurückgegeben.<br /><br /><p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=81f4642a-a663-490c-988d-c2d561e75593" /></div>
    </content>
  </entry>
  <entry>
    <title>UrlEncode und UrlDecode</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=c18b9709-beed-402e-b517-6bd1dbb5d4ff" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=c18b9709-beed-402e-b517-6bd1dbb5d4ff</id>
    <published>2007-01-11T13:34:37.97+01:00</published>
    <updated>2007-01-11T14:11:39.6408136+01:00</updated>
    <category term="Quellcode / .Net Framework 2.0" label="Quellcode / .Net Framework 2.0" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+.Net+Framework+2.0" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Nach einer kurzen Ruhepause möchte ich nun
wieder mit meiner Arbeit beginnen. Und gleich bin ich auf das erste Problem gestoßen.<br /><br />
Im Namespace System.Web gibt es eine Klasse die sich HttpUtility nennt und die unter
anderem die Funktion Urlencode und Urldecode implementiert. Leider hatte ich feststellen
müssen das diese Klasse nicht das macht was ich wollte. Mittels des WebClients aus
dem System.Net Namespace wollte ich einen Request absätzen der jedoch als Parameter
auch umlaute enthielt. Diese wurde jedoch nicht encodiert und auch der WebClient encodiert
sie nicht automatisch.<br /><br />
Aus diesem Grund habe ich mich drangemacht selber eine entsprechende Implementierung
zu schreiben und das Resultat möchte ich euch hier zur Verfügung stellen.<br /><br />
[code]<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs16     \cf2 Public\cf0  \cf2 Function\cf0  UrlEncode(\cf2 ByVal\cf0  strValue \cf2 As\cf0  \cf2 String\cf0 ) \cf2 As\cf0  \cf2 String\par ??\cf0         \cf2 Dim\cf0  strTempreturn \cf2 As\cf0  \cf2 String\cf0  = \cf13 ""\par ??\cf0         \cf2 For\cf0  \cf2 Each\cf0  strChar \cf2 As\cf0  \cf2 Char\cf0  \cf2 In\cf0  strValue\par ??            \cf2 If\cf0  InStr(1, \cf13 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"\cf0 , strChar) = 0 \cf2 Then\par ??\cf0                 strTempreturn += \cf13 "%"\cf0  &amp; Hex(Asc(strChar))\par ??            \cf2 Else\cf0  : strTempreturn += strChar\par ??            \cf2 End\cf0  \cf2 If\par ??\cf0         \cf2 Next\par ??\cf0         \cf2 Return\cf0  strTempreturn\par ??    \cf2 End\cf0  \cf2 Function\par ??\par ??\cf0     \cf2 Public\cf0  \cf2 Function\cf0  UrlDecode(\cf2 ByVal\cf0  strValue \cf2 As\cf0  \cf2 String\cf0 ) \cf2 As\cf0  \cf2 String\par ??\cf0         \cf2 Dim\cf0  strTempreturn \cf2 As\cf0  \cf2 String\cf0  = \cf13 ""\par ??\cf0         \cf2 Dim\cf0  arrTempString() \cf2 As\cf0  \cf2 String\cf0  = strValue.Split(\cf13 "%"\cf0 )\par ??        \cf2 For\cf0  \cf2 Each\cf0  strEntry \cf2 As\cf0  \cf2 String\cf0  \cf2 In\cf0  arrTempString\par ??            \cf2 If\cf0  strEntry.Length &gt;= 2 \cf2 Then\par ??\cf0                 \cf2 If\cf0  IsHex(strEntry.Substring(0, 2)) \cf2 Then\par ??\cf0                     strTempreturn += Chr(\cf13 "&amp;H"\cf0  &amp; strEntry.Substring(0, 2))\par ??                    strTempreturn += strEntry.Substring(2)\par ??                \cf2 Else\cf0  : strTempreturn += \cf13 "%"\cf0  &amp; strEntry\par ??                \cf2 End\cf0  \cf2 If\par ??\cf0             \cf2 Else\cf0  : strTempreturn += strEntry\par ??            \cf2 End\cf0  \cf2 If\par ??\cf0         \cf2 Next\par ??\cf0         \cf2 Return\cf0  strTempreturn\par ??    \cf2 End\cf0  \cf2 Function\par ??\par ??\cf0     \cf2 Public\cf0  \cf2 Function\cf0  IsHex(\cf2 ByVal\cf0  strValue \cf2 As\cf0  \cf2 String\cf0 ) \cf2 As\cf0  \cf2 Boolean\par ??\cf0         \cf2 Dim\cf0  bolTempreturn \cf2 As\cf0  \cf2 Boolean\cf0  = \cf2 True\par ??\cf0         \cf2 If\cf0  strValue.Length = 1 \cf2 Or\cf0  strValue.Length = 2 \cf2 Then\par ??\cf0             \cf2 For\cf0  \cf2 Each\cf0  strChar \cf2 As\cf0  \cf2 Char\cf0  \cf2 In\cf0  strValue\par ??                \cf2 If\cf0  InStr(1, \cf13 "0123456789ABCDEF"\cf0 , strChar) = 0 \cf2 Then\par ??\cf0                     bolTempreturn = \cf2 False\par ??\cf0                 \cf2 End\cf0  \cf2 If\par ??\cf0             \cf2 Next\par ??\cf0         \cf2 Else\cf0  : bolTempreturn = \cf2 False\par ??\cf0         \cf2 End\cf0  \cf2 If\par ??\cf0         \cf2 Return\cf0  bolTempreturn\par ??    \cf2 End\cf0  \cf2 Function}
--><div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 8pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    1</span>     <span style="color: blue;">Public</span><span style="color: blue;">Function</span> UrlEncode(<span style="color: blue;">ByVal</span> strValue <span style="color: blue;">As</span><span style="color: blue;">String</span>) <span style="color: blue;">As</span><span style="color: blue;">String</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    2</span>    
    <span style="color: blue;">Dim</span> strTempreturn <span style="color: blue;">As</span><span style="color: blue;">String</span> = <span style="color: maroon;">""</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    3</span>    
    <span style="color: blue;">For</span><span style="color: blue;">Each</span> strChar <span style="color: blue;">As</span><span style="color: blue;">Char</span><span style="color: blue;">In</span> strValue
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    4</span>    
        <span style="color: blue;">If</span> InStr(1, <span style="color: maroon;">"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"</span>,
strChar) = 0 <span style="color: blue;">Then</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    5</span>    
            strTempreturn += <span style="color: maroon;">"%"</span> &amp;
Hex(Asc(strChar))
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    6</span>    
        <span style="color: blue;">Else</span> : strTempreturn
+= strChar
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    7</span>    
        <span style="color: blue;">End</span><span style="color: blue;">If</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    8</span>    
    <span style="color: blue;">Next</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    9</span>    
    <span style="color: blue;">Return</span> strTempreturn
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   10</span>     <span style="color: blue;">End</span><span style="color: blue;">Function</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   11</span> 
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   12</span>     <span style="color: blue;">Public</span><span style="color: blue;">Function</span> UrlDecode(<span style="color: blue;">ByVal</span> strValue <span style="color: blue;">As</span><span style="color: blue;">String</span>) <span style="color: blue;">As</span><span style="color: blue;">String</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   13</span>    
    <span style="color: blue;">Dim</span> strTempreturn <span style="color: blue;">As</span><span style="color: blue;">String</span> = <span style="color: maroon;">""</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   14</span>    
    <span style="color: blue;">Dim</span> arrTempString() <span style="color: blue;">As</span><span style="color: blue;">String</span> =
strValue.Split(<span style="color: maroon;">"%"</span>)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   15</span>    
    <span style="color: blue;">For</span><span style="color: blue;">Each</span> strEntry <span style="color: blue;">As</span><span style="color: blue;">String</span><span style="color: blue;">In</span> arrTempString
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   16</span>    
        <span style="color: blue;">If</span> strEntry.Length
&gt;= 2 <span style="color: blue;">Then</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   17</span>    
            <span style="color: blue;">If</span> IsHex(strEntry.Substring(0,
2)) <span style="color: blue;">Then</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   18</span>    
                strTempreturn
+= Chr(<span style="color: maroon;">"&amp;H"</span> &amp; strEntry.Substring(0, 2))
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   19</span>    
                strTempreturn
+= strEntry.Substring(2)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   20</span>    
            <span style="color: blue;">Else</span> :
strTempreturn += <span style="color: maroon;">"%"</span> &amp; strEntry
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   21</span>    
            <span style="color: blue;">End</span><span style="color: blue;">If</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   22</span>    
        <span style="color: blue;">Else</span> : strTempreturn
+= strEntry
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   23</span>    
        <span style="color: blue;">End</span><span style="color: blue;">If</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   24</span>    
    <span style="color: blue;">Next</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   25</span>    
    <span style="color: blue;">Return</span> strTempreturn
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   26</span>     <span style="color: blue;">End</span><span style="color: blue;">Function</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   27</span> 
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   28</span>     <span style="color: blue;">Public</span><span style="color: blue;">Function</span> IsHex(<span style="color: blue;">ByVal</span> strValue <span style="color: blue;">As</span><span style="color: blue;">String</span>) <span style="color: blue;">As</span><span style="color: blue;">Boolean</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   29</span>    
    <span style="color: blue;">Dim</span> bolTempreturn <span style="color: blue;">As</span><span style="color: blue;">Boolean</span> = <span style="color: blue;">True</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   30</span>    
    <span style="color: blue;">If</span> strValue.Length = 1 <span style="color: blue;">Or</span> strValue.Length
= 2 <span style="color: blue;">Then</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   31</span>    
        <span style="color: blue;">For</span><span style="color: blue;">Each</span> strChar <span style="color: blue;">As</span><span style="color: blue;">Char</span><span style="color: blue;">In</span> strValue
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   32</span>    
            <span style="color: blue;">If</span> InStr(1, <span style="color: maroon;">"0123456789ABCDEF"</span>,
strChar) = 0 <span style="color: blue;">Then</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   33</span>    
                bolTempreturn
= <span style="color: blue;">False</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   34</span>    
            <span style="color: blue;">End</span><span style="color: blue;">If</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   35</span>    
        <span style="color: blue;">Next</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   36</span>    
    <span style="color: blue;">Else</span> : bolTempreturn = <span style="color: blue;">False</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   37</span>    
    <span style="color: blue;">End</span><span style="color: blue;">If</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   38</span>    
    <span style="color: blue;">Return</span> bolTempreturn
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   39</span>     <span style="color: blue;">End</span><span style="color: blue;">Function</span></p></div>
[/code]<br /><br />
Beide Funktionen erwartet einen String als Parameter und liefern ebenfalls einen String
zurück.<br /><br />
Kurz zu den Funktionsweisen:<br /><br /><b>UrlEncode:<br /><br /></b>Diese Funktion prüft ob die im ubergebenen String enthaltenen Zeichen in der Zeichsatz
(0-9a-zA-Z) passen (wobei ä,ü,ö,.. ignoriert werden). Sollte dem nicht so sein, wird
der Hex-Wert des ASCII-Code dieses Zeichens ermittelt.<br /><br /><b>UrlDecode:</b><br /><br />
Diese Funktion teilt den übergebenen String anhand des %-Zeichens und prüft ob anschließend
die nächsten zwei Zeichen einen Hex-Wert darstellen. Wenn ja wird dieser wieder in
ein Char convertiert.<br /><br /><b>IsHex:</b><br /><br />
Diese Funktion überprüft lediglich ob die übergebene Zeichenfolge aus einem bzw. zwei
Zeichen besteht und im Zeichsatz für Hex-Werte enthalten ist.<br /><br /><br /><p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=c18b9709-beed-402e-b517-6bd1dbb5d4ff" /></div>
    </content>
  </entry>
  <entry>
    <title>Response Buffer Limit Exceeded (80004005)</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=5f4e1c28-8929-4e08-8ca4-2e676b13cf4a" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=5f4e1c28-8929-4e08-8ca4-2e676b13cf4a</id>
    <published>2006-11-14T09:52:05.739+01:00</published>
    <updated>2006-11-16T12:02:43.8289123+01:00</updated>
    <category term="Fehler und L&amp;#246;sungen" label="Fehler und L&amp;#246;sungen" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Fehler+und+L%c3%b6sungen" />
    <category term="Quellcode / ASP" label="Quellcode / ASP" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+ASP" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Die Fehlermeldung "Response Buffer Limit
Exceeded" wird vom IIS geworfen sobald der Puffer einer Webseite eine Größe von 4
MB - 4194304 Byte - überschreitet. Dies trifft auch auf alle eingebetteten Objecte
wie Bilder, PDFs und äühnliches zu die direkt ins ASP eingebunden sind.<br /><br />
Für dieses Problem gibt es verschiedene Lösungen.<br /><br /><b>Lösung 1 - Verwendung von Response.Flush: </b><br /><br />
Bei einer reinen HTML-Generrierung ist es möglich die Eigenschaft <i>Response.Buffer</i> zu
setzten. Diese bewirkt das erstmal garnix besonderes. Erst im Zusammenhang mit mit <i>Response.Flush()</i> wird
es interessant.<br /><br />
Sobald <i>Response.Buffer</i> auf True gesetzt wurde wird der generierte Seiteninhalt
bis zum nächsten Auftreten von <i>Response.Flush()</i> oder dem Ende der Seite gechacht.<br /><br />
Hier ein kleines Beispiel<br /><br />
[code] Response.Buffer = True<br />
For i=0 to Ubound(arr)<br />
   set RS = db.execute("Select from table where y=" &amp; arr(i))<br />
   Do While not rs.eof and rs.recordcount&gt;1<br />
     .....<br />
   Loop<br />
   Response.Flush()<br />
Next<br />
 [/code] 
<br /><p><b>Lösung 2 - Anhebung des ASPBufferLimits:</b></p><br />
Die zweite Lösung ist dann zu bevorzugen wenn es sich nicht um eine HTML-Generierung
handelt. Als Beispiel kann ich hier zum Beispiel aufführen das eine PDF geladen werden
soll die größer als 4MB ist - diesen Fall hatte ich heut selber gehabt.<br /><br />
Im AdminScripts-Verzeichnis des IIS (Inetpubs) findet sich das Script <span class="userInput"><i>adsutil.vbs</i> welches
man wie folgt aufrufen muss.</span><br /><br />
[code]cscript.exe adsutil.vbs SET w3svc/aspbufferinglimit LimitSize[/code]<br /><p><var>LimitSize</var> stellt die Puffer-Limit-Größe in Byte dar. Beispielsweise wird
mit der Nummer 67108864 die Puffer-Limit-Größe zu 64 MB festgelegt.
</p>
Nach einem Neustart der IIS-Webinstanz wird die Einstellung übernommen und das Problem
sollte nicht mehr auftreten.<br /><br />
Floyd<br /><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=5f4e1c28-8929-4e08-8ca4-2e676b13cf4a" /></div>
    </content>
  </entry>
  <entry>
    <title>NULL in ASP binden</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=c211611f-fad6-441a-837a-07778c6fbde3" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=c211611f-fad6-441a-837a-07778c6fbde3</id>
    <published>2006-11-08T18:33:48.4276939+01:00</published>
    <updated>2006-11-08T18:33:48.4276939+01:00</updated>
    <category term="Quellcode / ASP" label="Quellcode / ASP" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+ASP" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Häufig stößt man in diversen Foren auf die Frage wie man in ASP NULL-Werte in eine
Datenbank binden kann. Leider liefert ASP und ADODB keine Möglichkeit von Haus aus
mit dies zu machen. Hierzu muss man sich einem kleinen Trick behelfen.
</p>
[code]<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs16 dbNull = db.execute(\cf13 "select null"\cf0 ).fields(0)}
--><div style="FONT-SIZE: 8pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"><p style="MARGIN: 0px"><span style="COLOR: #2b91af">    1</span> dbNull = db.execute(<span style="COLOR: maroon">"select
null"</span>).fields(0)
</p></div>
[/code]<br /><p>
Natürlich kann man auch den weg gehen das man "NULL" direkt ins Statment schreib,
doch dieser Weg ist weder besonders schön noch besonders empfehlenswert da dies zumeist
doppelte Code-Pflege mit sich bringt.
</p><p>
Floyd
</p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=c211611f-fad6-441a-837a-07778c6fbde3" /></div>
    </content>
  </entry>
  <entry>
    <title>Function: ReturnDBNull - neu aufgelegt</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=997295b9-23f7-4ded-8efa-bdb5dc3af91d" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=997295b9-23f7-4ded-8efa-bdb5dc3af91d</id>
    <published>2006-11-08T18:26:41.557+01:00</published>
    <updated>2006-11-08T19:05:45.7736517+01:00</updated>
    <category term="Quellcode / .Net Framework 2.0" label="Quellcode / .Net Framework 2.0" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+.Net+Framework+2.0" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Im Artikel <a class="TitleLinkStyle" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=74447684-4fcc-424f-8888-f0785be80e91" rel="bookmark">SQL-Injektion
oder Wie binde ich richtig für Anfänger</a> hatte ich vor einiger Zeit mal eine
Funktionsblock gepostet um NULL in eine Datenbank zu binden. Da ich die Funktion jetzt
mal wieder brauchte wollt ich sie natürlich gleich verbessern. Die neue
Version ist um einiges schlanker und hat auch keinen begrenzten Typenumfang mehr.
</p>
[code]<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs16     \cf2 Function\cf0  ReturnDBNull(\cf2 ByVal\cf0  value \cf2 As\cf0  VariantType) \cf2 As\cf0  \cf2 Object\par ??\cf0         \cf2 If\cf0  IsNothing(value) \cf2 Or\cf0  value = vbEmpty \cf2 Or\cf0  value = vbNull \cf2 Then\par ??\cf0             \cf2 Return\cf0  DBNull.Value\par ??        \cf2 Else\par ??\cf0             \cf2 Return\cf0  value\par ??        \cf2 End\cf0  \cf2 If\par ??\cf0     \cf2 End\cf0  \cf2 Function}
--><div style="FONT-SIZE: 8pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"><p style="MARGIN: 0px"><span style="COLOR: #2b91af">   1</span>     <span style="COLOR: blue">Function</span> ReturnDBNull(<span style="COLOR: blue">ByVal</span> value <span style="COLOR: blue">As</span><span style="COLOR: blue">Object</span>) <span style="COLOR: blue">As</span><span style="COLOR: blue">Object</span></p><p style="MARGIN: 0px"><span style="COLOR: #2b91af">   2</span>         <span style="COLOR: blue">If</span> IsNothing(value) <span style="COLOR: blue">Or</span> value
= vbEmpty <span style="COLOR: blue">Or</span> value = vbNull <span style="COLOR: blue">Then</span></p><p style="MARGIN: 0px"><span style="COLOR: #2b91af">   3</span>        
    <span style="COLOR: blue">Return</span> DBNull.Value
</p><p style="MARGIN: 0px"><span style="COLOR: #2b91af">   4</span>         <span style="COLOR: blue">Else</span></p><p style="MARGIN: 0px"><span style="COLOR: #2b91af">   5</span>        
    <span style="COLOR: blue">Return</span> value
</p><p style="MARGIN: 0px"><span style="COLOR: #2b91af">   6</span>         <span style="COLOR: blue">End</span><span style="COLOR: blue">If</span></p><p style="MARGIN: 0px"><span style="COLOR: #2b91af">   7</span>     <span style="COLOR: blue">End</span><span style="COLOR: blue">Function</span></p></div>
[/code]<br /><p>
Floyd
</p><p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=997295b9-23f7-4ded-8efa-bdb5dc3af91d" /></div>
    </content>
  </entry>
  <entry>
    <title>About me</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=8d907b4f-9f93-40f0-b808-713b9425d671" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=8d907b4f-9f93-40f0-b808-713b9425d671</id>
    <published>2006-11-07T16:12:44.943+01:00</published>
    <updated>2006-11-07T16:14:01.2423424+01:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <strong>Über dieses Blog</strong>
        </p>
        <p>
Diese Blog habe ich im April 2006 aus ein wenig Langeweile und auf der Suche nach
etwas neuem auf die Beine gestellt mit dem Ziel es als eine Art privates Quellcodearchiv
zu verwenden. Der Schwerpunkt dieses Blogs liegt dabei auf <a href="http://de.wikipedia.org/wiki/Microsoft_.NET">.NET-Technologie</a> von <a href="http://de.wikipedia.org/wiki/Microsoft">Microsoft</a> wobei
ich mich nicht auf diese beschränke. Vorallem die Sprachen und Technologien die
ich beruflich und privat einsetze - wie zum Beispiel <a href="http://de.wikipedia.org/wiki/Active_Server_Pages">Active
Server Pages ASP</a>, <a href="http://de.wikipedia.org/wiki/MSSQL">MSSQL (T-SQL)</a> -
möchte in in diesem Blog ebenfalls behandeln.<br />
Hin und wieder kommt auch mal ein privater Post hinzu.
</p>
        <p>
          <strong>Über mich</strong>
        </p>
        <p>
Zu mir gibt es eigendlich nicht viel zu sagen. Ich wurde im August 1984 in Leipzig geboren
und lebe seither in einem kleinen Dorf etwa 25km von Leipzig entfernt. Im Dezember
1996 bekamm ich meinen ersten eigenen Computer den ich mir durch viel Hausarbeit schwer
erarbeiten musste. ^^ Internet war damals noch nicht und so musste ich mich mit einigen
wenigen Zeitschriften und den WSH- und VBS-Scripten begügen. So begann ich meine ersten
Begegnungen mit der Programmierei eher mit einigen spielereien an HTML, VBS und QBasic.Irgendwann
viel mir dann in der Bücherrei ein Buch über Visual Basic in die Hand. Nachdem ich
dieses Buch innerhalb von 2 Wochen begierig verschlugen hatte war wieder einmal Hausarbeit
fällig :D denn das Visual Studio 6 musste her. Als Schüler-Version war diese auch
relativ erschwinglich. Somit begann ich meine ersten Progrämmchen zu schreiben. Wärend
die anderen in meiner Klasse noch überlegten was Sie werden wollten stand es für mich
schon relativ zeitig Fest: Programmierer. Also beworb ich mich als Fachinformatiker
für Anwendungsentwicklung und fand eine Ausbildung bei der Stadt Leipzig. Nachdem
ich diese erfolgreich abschließen konnte musste ich eine weile Warten bis ich dann
endlich eine Firma fand die mich einstellen wollte. Doch diese Zeit hab ich intensiv
genutzt. .Net war grade frisch rausgekommen und wollte erobert werden. Zwischenzeitlich
verdiente ich mich hin und wieder durch kleiner Projekte ein paar Euro dazu. Das größte
war ein Verschlüsselungssystem für PDF-Dokumente für eine Schweitzer Bank. Damals
gab es noch eine sehr aktive Community im programmierer-borad.de und Zusammen mit
ein paar anderen Mitgliedern gründete ich damals das Projekt "Programmers-United"
und leitetet dieses Projekt über ein paar Jahre lang bis es Aufgrund von Teilnahmemangel
(begündet durch Abitur, Bund, etc. der aktivste Mitglieder) versiegte. Eine neue Aufgabe
in der Community musste her. Ich stieß auf <a href="http://www.it-academy.cc">it-acamdey</a> und
bewarb mich als Mitglied der Artikeladministration. Mitlerweile bin ich Nun dort
zum Bereichsleiter aufgestiegen.
</p>
        <p>
          <strong>Erfahungungen</strong>
        </p>
        <ul>
          <li>
VB.Net, ASP.Net (seit Version 1.0), Visual Basic 6, ASP, VBS, JavaScript, CSS,
HTML, XML, SQL (T-SQL) und Grundlagen in: Java, C, C++, PHP, C# 
</li>
          <li>
MSSQL-Server (2000 und 2005), Firebird, Access, SQLite, MySQL 
</li>
          <li>
Windows 95 bis Vista, Windows 2000 Server bis 2003 und Grundlagen in: Linux
(seit Suse Linux 7.0), Apple Mac OS X 
</li>
          <li>
Visual Studio .Net 2003 bis 2005, #Develop, CVS, Subversion 
</li>
          <li>
Microsoft Office, OpenOffice, Lotus Notes 
</li>
          <li>
...</li>
        </ul>
        <p>
Ich denke das sollte es erstmal übermich gewesen sein. Wer noch Fragen hat kann sich
gerne bei mir per <a onclick="javascript:var e1='%67%6d%78%2e%6e%65%74',e2='mailto: ', e3='%66%6c%6f%79%64%5f%33';var e0=e2+e3+'%40'+e1+'?Subject=Comments on: Freakfabrik Softwareschmiede - Das Blog';(window.location?window.location.replace(e0):document.write(e0));" href="#">eMail</a> melden.
</p>
        <img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=8d907b4f-9f93-40f0-b808-713b9425d671" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Persistentes kopieren in die Zwischenablage</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=fa7a1e54-88d8-4396-a37e-4d370c0f5e17" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=fa7a1e54-88d8-4396-a37e-4d370c0f5e17</id>
    <published>2006-11-07T12:08:54.1+01:00</published>
    <updated>2006-11-07T12:10:20.3368068+01:00</updated>
    <category term="Quellcode / .Net Framework 2.0" label="Quellcode / .Net Framework 2.0" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+.Net+Framework+2.0" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Heute bin ich wiedermal in einem Forum auf die Frage gestoßen wie den Inhalt einer
Variable in die Zwischenablage kopieren, jedoch soll der Inhalt der Zwischenablage
auch nach Beendigung des Programms erhalten bleiben und somit anderen Programmen zur
Verfügung stehen.
</p>
        <p>
Die Lösung ist dabei Recht einfach. Die Funktion SetDataObject des Clipboard kopiert
bekanntlicherweise den Inhalt einer Variable in die Zwischenablage. Einen zweite
Parameter kann man jedoch optional noch angeben. Setzt man diesen auf "true" so sorgt
er dafür, dass der Inhalt nicht nach Beendigung des Programms wieder gelöscht
wird. Dies wird dann als "persistenz des Clipboard-Inhaltes" bezeichnet.
</p>
[code]<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs16 \cf2 Dim\cf0  strDaten \cf2 As\cf0  \cf2 String\cf0  = \cf13 "TestString"\par ??\cf0 Clipboard.SetDataObject(strDaten, \cf2 True\cf0 )}
--><div style="FONT-SIZE: 8pt; BACKGROUND: white; COLOR: black; FONT-FAMILY: Courier New"><p style="MARGIN: 0px"><span style="COLOR: blue">Dim</span> strDaten <span style="COLOR: blue">As</span><span style="COLOR: blue">String</span> = <span style="COLOR: maroon">"TestString"</span></p><p style="MARGIN: 0px">
Clipboard.SetDataObject(strDaten, <span style="COLOR: blue">True</span>)
</p></div>
[/code] 
<p><br />
Floyd
</p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=fa7a1e54-88d8-4396-a37e-4d370c0f5e17" /></div>
    </content>
  </entry>
  <entry>
    <title>DasBlog Update (1.9.6264.0)</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=6317fc4b-a183-4c05-9696-b4fdc9897bea" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=6317fc4b-a183-4c05-9696-b4fdc9897bea</id>
    <published>2006-10-06T20:47:44.297+02:00</published>
    <updated>2006-10-06T20:48:25.7979583+02:00</updated>
    <category term="dasBlog" label="dasBlog" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=dasBlog" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Hab soeben auf DasBlog 1.9.6264.0 upgedatet. Hab die Grundkonfiguration erstmal wieder
hergestellt. Morgen schau ich mir dann mal die Details an.
</p>
        <p>
 
</p>
        <p>
Gruß Floyd
</p>
        <p>
        </p>
        <img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=6317fc4b-a183-4c05-9696-b4fdc9897bea" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Unterstützte Datenbanksysteme - Die Zukunft</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=6dbbb4f0-8d0f-4700-9c3a-aa516e4831cf" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=6dbbb4f0-8d0f-4700-9c3a-aa516e4831cf</id>
    <published>2006-10-06T18:25:47.09+02:00</published>
    <updated>2006-10-07T10:28:21.5533783+02:00</updated>
    <category term="Projekte / equal" label="Projekte / equal" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Projekte+%7c+equal" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Für die Zukunft möchte ich persönlich folgende
Datenbanksysteme integriert haben:<br /><br /><u>dienstgesteuerte DBSe:<br /><br /></u>- MySQL<br />
- MS SQL Server<br />
- PostgreSQL<br />
- Firebird<br />
- Interbase<br />
- Ingres<br /><br /><u>Datei-basierende DBSe:<br /><br /></u>- SQLite<br />
- MSAccess<br />
- Firebird<br /><br /><br />
k00ni<br /><br />
ps.: Welche Version und welche nicht, ist erstmal uninteressant. Aber ich lege das
Augenmerk nicht nur auf "New-Stuff", sondern auch auf "ältere" Systeme.<br /><p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=6dbbb4f0-8d0f-4700-9c3a-aa516e4831cf" /></div>
    </content>
  </entry>
  <entry>
    <title>Unterstützte Datenbanksysteme</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=b0e44763-c21a-4949-bc24-34aebd536b88" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=b0e44763-c21a-4949-bc24-34aebd536b88</id>
    <published>2006-10-06T18:20:12.3498557+02:00</published>
    <updated>2006-10-06T18:20:12.3498557+02:00</updated>
    <category term="Projekte / equal" label="Projekte / equal" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Projekte+%7c+equal" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <div align="justify">Ich habe mir lange Gedanken darüber gemacht. Und ich denke, wir
sollten am Anfang 2-gleisig fahren. Einseits sollten wir die Open-Source-Datenbanksysteme
unterstützten. Andererseits auch die komerziellen, speziell aber die, die auch von
den "kleinen Leuten" genutzt werden. 
<br /><br />
Deshalb würde ich MySQL und MS Access angehen. MySQL deshalb, weil ich damit schon
seit fast 3 - 4 Jahren mehr oder weniger gearbeitet habe, meist in Verbindung mit
PHP. Ich kenne mich dort so aus, das ich schnell und effektiv administrative Aufgaben
lösen kann. MS Access wegen der starken Verwendung in privaten Haushalten und in sehr
kleinen Firmen. 
<br /><br />
Später würde ich dann auf MS SQL Server und SQLite gehen, je nachdem, was der Floyd
dazu sagt.<br /><br />
Dieser Post ist nur ein Vorschlag und noch nicht endgültig, es darf also diskutiert
werden.<br /><br /><u>Noch eine Anmerkung:</u> Wir sollten versuchen jetzt am Anfang viele "verschiedene"
Datenbanksysteme zu integrieren. Liegt daran, dass wir dann später Muster haben, wo
wir bei gleichartigen System ansätzen können. 
<br />
Mit dieser Formulierung meine ich Datenbanksysteme, die einerseits per Dienst betrieben
werden (MySQL, PostgreSQL, MSSQL Server). Oder als reines "Ein-Datei"-System, wie
beispielsweise SQLite. 
<br /><br /><br />
k00ni<br /></div>
        <p>
        </p>
        <img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=b0e44763-c21a-4949-bc24-34aebd536b88" />
      </div>
    </content>
  </entry>
  <entry>
    <title>equal Reloaded</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=0826e764-1865-4a46-9f30-2bfedf8b18e4" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=0826e764-1865-4a46-9f30-2bfedf8b18e4</id>
    <published>2006-09-23T22:36:58.148+02:00</published>
    <updated>2006-09-23T22:37:33.2120709+02:00</updated>
    <category term="Projekte / equal" label="Projekte / equal" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Projekte+%7c+equal" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <b>Zu meiner Abwesenheit</b>
        <br />
        <br />
Es ist schon eine Weile her, dass ich hier etwas gebloggt habe. Das lag daran, dass
ich bei der Bundeswehr meine AGA (Allgemeine Grundausbildung) absolviert habe. Nächste
Woche Donnerstag wechsele ich dann den Standort von Bremen (Schwanewede) nach Leipzig
(Delitzsch). Während dieser Zeit ist mir kaum möglich gewesen etwas am Quellcode zu
basteln. Einerseits hatte ich die ersten Wochen so gut wie keine Zeit. Andererseits
war ich so geschafft, dass mir in freien Minuten, die selten waren, einfach die Kraft
fehlte, etwas zu programmieren. Da habe ich mich lieber mal ein paar Stunden aufs
Ohr gehauen.<br /><br />
Wie dem auch sei, die AGA ist vorbei und nun beginnt das "normale" Soldatenleben.
Wie es da mit meiner Zeit aussieht weiß ich nicht. Aber die letzten 2 Wochen habe
ich langsam wieder angefangen und am equal-Projekt weitergearbeitet. Ich hoffe, dass
ich dass den Rest meiner Wehrdienstzeit auch kann. 
<br /><br /><br /><b>Zur Entwicklung des Projektes<br /><br /></b>In dieser Richtung hat sich einiges getan. Schon vor 3 Monaten konnte man sich
aus einer ausgwählten Datenbank alle Tabellen anzeigen lassen, sowie den Inhalt einer
bestimmten dazu. Nun arbeite ich daran, dass man neue Tabellen anlegen kann. Dazu
habe ich die Bibliothek equal.Objects überarbeitet und neue Objekte hinzugefügt bzw.
bestehende modifiziert oder gelöscht. 
<br /><br />
2 Punkte sind sehr markant bis jetzt:<br /><br />
Einerseits habe ich das Verhalten des Providers geändert. Es sind nun nicht mehr alle
Funktionen in einer Klasse zu finden, sondern sind auf 3 aufgeteilt wurden: ConnectionFunctions,
TableFunctions und DatabaseFunctions. Damit wird die ganze Sache ressourcenschonender,
da bei der Arbeit mit Tabellen nicht unbedingt auch Funktionen für Datenbanken oder
Verbindungen braucht. Diese würden nämlich sonst zusätzlich mitgeladen werden. 
<br />
Andererseits habe ich mich dazu entschlossen, den Kern des Projektes komplett in C#
zu schreiben. Dazu gehört der Namespace equal, als auch equal.Objects. Letzteres war
erst in Visual Basic verfasst wurden, um dem Floyd etwas entgegen zukommen. Wenn man
aber bei der Entwicklung ständig zwischen den Sprachen springen muss, dass bremst
dass unnötig. Zusätzlich dazu schreibe ich auch den MySQL 5.0 Povider in C#. 
<br /><br />
Bei der Portierung des Quellcodes sind mir viele kleine Fehler aufgefallen (inkonsistente
Variablennamen, aufgeblähte Klassen etc.), welche ich gleich behoben habe. Ich denke
mit diesem Schritt fahre ich bei der Entwicklung besser. Ich hoffe, dass der Floyd
es versteht :)<br /><br /><b><br />
Ein Blick in die Glaskugel</b><br /><br />
Ich werde die nächsten Stunden damit verbringen, das Anlegen, Modifizieren und Löschen
von MySQL 5.0 Tabellen zu implementieren. Als nächster Punkt ist das Anlegen und Löschen
von Datenbanken dran. Ist das komplett geschafft, so werde ich dies in Visual Basic
.NET für den MS SQL Server portieren. Der Floyd drängte schon am Anfang, dass wir
den MS SQL Server mit reinnehmen. Ich werde aber erstmal den 2000er nehmen, da ich
denke, dass die 2005er Version noch nicht sehr verbreitet ist. 
<br /><br />
Vom Projektmäßigen her wars das erstmal von meiner Seite. Ich schätze in ein bis 2
Wochen wird das erledigt sein, je nachdem wie es der Bund zulässt. Stehen die Grundfunktionen
des Frameworks, dann wird es auch endlich mal einen Download dazu geben. Aber dazu
später mehr, denn im jetzigen Zustand zerballert ihr euch eure Datenbanksysteme nur
damit, statt was vernünftiges damit anzustellen.<br /><br /><br />
k00ni<br /><br />
PostSkriptum: Ich spiele mit dem Gedanken, ein Add-In für das VS.NET 2005 zu schreiben,
welches das Entwickeln von Anwendungen für das equal-Framework erlaubt.<p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=0826e764-1865-4a46-9f30-2bfedf8b18e4" /></div>
    </content>
  </entry>
  <entry>
    <title>Überprüfen ob PopUp-Blocker im IE aktiv ist</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=6b384ae0-8d07-447a-9208-bbe11e52d71e" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=6b384ae0-8d07-447a-9208-bbe11e52d71e</id>
    <published>2006-09-15T16:55:36.319+02:00</published>
    <updated>2006-09-15T16:56:10.0701099+02:00</updated>
    <category term="Quellcode / JavaScript" label="Quellcode / JavaScript" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+JavaScript" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Mit nem nun folgenden Script kann man überprüfen
ob beim Internetexplorer der PopUp-Blocker aktiviert ist. Sollte der PopUp-Blocker
aktiviert sein oder innerhalb des PopUps darf kein JavaScript ausgeführt werden gibt
die Funktion <i>"CheckPopUp" "false"</i> zurück, ansonsten <i>"true"</i>.<br /><br />
Das Script basiert auf 2 Seiten. Und zwar Seite eins, die aufrufende Seite versucht
ein PopUp zu öffnen. Dieses PopUp versucht - insofern es geladen wurde - ein Cookie
zu setzten welches die aufrufende Seite wieder auswertet.<br /><br />
Hier erstmal der Code der Seite 1:<br /><br />
[code]<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs16 \cf2 &lt;\cf13 script\cf0  \cf6 language\cf2 =javascript&gt;\par ??function\cf0  setCookie(name, wert)\{\par ??   document.cookie = unescape(name)+\cf13 "="\cf0 +unescape(wert);\par ??\}\par ??\cf2 function\cf0  getCookie(name)\{\par ??   \cf2 var\cf0  i=0;  \cf11 //Suchposition im Cookie\par ??\cf0    \cf2 var\cf0  suche = name+\cf13 "="\cf0 ;\par ??   \cf2 while\cf0  (i&lt;document.cookie.length)\{\par ??      \cf2 if\cf0  (document.cookie.substring(i, i+suche.length)==suche)\{\par ??         \cf2 var\cf0  ende = document.cookie.indexOf(\cf13 ";"\cf0 , i+suche.length);\par ??         ende = (ende&gt;-1) ? ende : document.cookie.length;\par ??         \cf2 var\cf0  cook = document.cookie.substring(i+suche.length, ende);\par ??         \cf2 return\cf0  unescape(cook);\par ??      \}\par ??      i++;\par ??   \}\par ??   \cf2 return\cf0  \cf2 null\cf0 ;\par ??\}\par ??\cf2 function\cf0  CheckPopUp()\{\par ??   setCookie(\cf13 "popupblocker"\cf0 , \cf13 "enabled"\cf0 );\par ??   \cf2 var\cf0  F1 = window.open(\cf13 "checkpopup.html"\cf0 ,\cf13 "frmPopUpCheck"\cf0 ,\cf13 "width=1,height=1,left=0,top=0"\cf0 );\par ??   sleep(100);\par ??   F1.close();\par ??   \cf2 return\cf0  (getCookie(\cf13 'popupblocker'\cf0 )==\cf13 'enabled'\cf0 );   \par ??\}\par ??\cf2 function\cf0  doCheckPopUp()\{\par ??   \cf2 return\cf0  getCookie(\cf13 'popupblocker'\cf0 );\par ??\}\par ??\cf2 function\cf0  sleep(numberMillis)\{\par ??    \cf2 var\cf0  exitTime = (\cf2 new\cf0  Date()).getTime() + numberMillis;\par ??    \cf2 while\cf0  (\cf2 true\cf0 )\par ??    \{\par ??        \cf2 if\cf0  ((\cf2 new\cf0  Date()).getTime() &gt; exitTime)\{\cf2 return\cf0 ;\}\par ??    \}\par ??\}\par ??alert(CheckPopUp());\par ??\cf2 &lt;/\cf13 script\cf2 &gt;}
--><div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 8pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    1</span> <span style="color: blue;">&lt;</span><span style="color: maroon;">script</span><span style="color: red;">language</span><span style="color: blue;">=javascript&gt;</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    2</span> <span style="color: blue;">function</span> setCookie(name,
wert){
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    3</span>   
document.cookie = unescape(name)+<span style="color: maroon;">"="</span>+unescape(wert);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    4</span> }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    5</span> <span style="color: blue;">function</span> getCookie(name){
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    6</span>    <span style="color: blue;">var</span> i=0;  <span style="color: green;">//Suchposition
im Cookie</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    7</span>    <span style="color: blue;">var</span> suche
= name+<span style="color: maroon;">"="</span>;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    8</span>    <span style="color: blue;">while</span> (i&lt;document.cookie.length){
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    9</span>    
  <span style="color: blue;">if</span> (document.cookie.substring(i, i+suche.length)==suche){
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   10</span>    
    <span style="color: blue;">var</span> ende = document.cookie.indexOf(<span style="color: maroon;">";"</span>,
i+suche.length);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   11</span>    
    ende = (ende&gt;-1) ? ende : document.cookie.length;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   12</span>    
    <span style="color: blue;">var</span> cook = document.cookie.substring(i+suche.length,
ende);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   13</span>    
    <span style="color: blue;">return</span> unescape(cook);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   14</span>    
  }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   15</span>    
  i++;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   16</span>   
}
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   17</span>    <span style="color: blue;">return</span><span style="color: blue;">null</span>;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   18</span> }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   19</span> <span style="color: blue;">function</span> CheckPopUp(){
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   20</span>   
setCookie(<span style="color: maroon;">"popupblocker"</span>, <span style="color: maroon;">"enabled"</span>);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   21</span>    <span style="color: blue;">var</span> F1
= window.open(<span style="color: maroon;">"checkpopup.html"</span>,<span style="color: maroon;">"frmPopUpCheck"</span>,<span style="color: maroon;">"width=1,height=1,left=0,top=0"</span>);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   22</span>   
sleep(100);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   23</span>   
F1.close();
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   24</span>    <span style="color: blue;">return</span> (getCookie(<span style="color: maroon;">'popupblocker'</span>)==<span style="color: maroon;">'enabled'</span>);   
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   25</span> }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   26</span> <span style="color: blue;">function</span> doCheckPopUp(){
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   27</span>    <span style="color: blue;">return</span> getCookie(<span style="color: maroon;">'popupblocker'</span>);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   28</span> }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   29</span> <span style="color: blue;">function</span> sleep(numberMillis){
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   30</span>     <span style="color: blue;">var</span> exitTime
= (<span style="color: blue;">new</span> Date()).getTime() + numberMillis;
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   31</span>     <span style="color: blue;">while</span> (<span style="color: blue;">true</span>)
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   32</span>    
{
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   33</span>    
    <span style="color: blue;">if</span> ((<span style="color: blue;">new</span> Date()).getTime()
&gt; exitTime){<span style="color: blue;">return</span>;}
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   34</span>    
}
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   35</span> }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   36</span> alert(CheckPopUp());
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">   37</span> <span style="color: blue;">&lt;/</span><span style="color: maroon;">script</span><span style="color: blue;">&gt;</span></p></div>
[/code]<br /><br />
Und anschließend den Code der Seite 2 mit dem Name <i>"checkpopup.html"</i>:<br /><br />
[code]<!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs16 \cf2 &lt;\cf13 script\cf2 &gt;\par ??function\cf0  setCookie(name, wert)\{\par ??   document.cookie = unescape(name)+\cf13 "="\cf0 +unescape(wert);\par ??\}\par ??setCookie(\cf13 "popupblocker"\cf0 , \cf13 "disabled"\cf0 );\par ??\cf2 &lt;/\cf13 script\cf2 &gt;}
--><div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 8pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    1</span> <span style="color: blue;">&lt;</span><span style="color: maroon;">script</span><span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    2</span> <span style="color: blue;">function</span> setCookie(name,
wert){
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    3</span>   
document.cookie = unescape(name)+<span style="color: maroon;">"="</span>+unescape(wert);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    4</span> }
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    5</span> setCookie(<span style="color: maroon;">"popupblocker"</span>, <span style="color: maroon;">"disabled"</span>);
</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">    6</span> <span style="color: blue;">&lt;/</span><span style="color: maroon;">script</span><span style="color: blue;">&gt;</span></p></div>
[/code]<br /><br />
Ich werde versuchen dieses Funktion auch für den Firefox abzubilden was mir leider
bisher noch nicht gelang.<br /><br /><p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=6b384ae0-8d07-447a-9208-bbe11e52d71e" /></div>
    </content>
  </entry>
  <entry>
    <title>Resultset eines Select-Statments eine fortlaufende Nummer zuweisen</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=74b361ac-70a0-4ac4-b05f-e67eb94acbf7" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=74b361ac-70a0-4ac4-b05f-e67eb94acbf7</id>
    <published>2006-08-31T11:09:29.819+02:00</published>
    <updated>2006-08-31T11:09:29.8199412+02:00</updated>
    <category term="Quellcode / MSSQL" label="Quellcode / MSSQL" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+MSSQL" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">So wie versprochen geht es jetzt darum wie
man einem Resultset eine fortlaufende Nummer zuweist.<br />
Leider geht dies mit MSSQL boardmitteln nicht wodurch ich gezwungen war eine wenig
zu improvisieren. Im Artikel <a href="http://blog.freakfabrik.net/PermaLink.aspx?guid=148ccb4c-f703-4475-825c-3e1b34d23a5e">Temporäre
Tabellen anlegen und löschen</a> habe ich bereits beschrieben wie man temporäre Tabellen
anlegen kann. Dieses Prinzip mach ich mir jetzt zu nutze.<br /><br />
Hier jetzt erstmal das komplette Statement:<br /><br />
[code]/*Prüfen ob die Tabelle "#tblTemp" schon exsistiert - wenn ja löschen<br />
IF not OBJECT_ID('tempdb..#tblTemp') IS NULL 
<br />
begin<br />
    drop table [#tblTemp]<br />
end<br /><br />
/*Temporäre Tabelle "#tblTemp" anlegen<br />
create table #tblTemp(<br />
    [a_id] [int] IDENTITY (1, 1) NOT NULL ,<br />
    [a_Spalte1] [int],<br />
    [a_Spalte2] [varchar])<br />
go<br /><br />
/*Temporäre Tabelle "#tblTemp" mit Werten füllen*/<br />
insert into #tblTemp (a_spalte1,a_Spalte2)<br />
    select a_spalte1,a_Spalte2 from tblQuelle --Das Selectstatement
das mit einer fortlaufenden Nummer angezeigt werden soll<br /><br />
/*Temporäre Tabelle "#tblTemp" auslesen<br />
select * from #tblTemp[/code]<br /><br />
So was passiert hier:<br />
Im ersen Schritt wird geprüft ob die Tabelle #tblTemp schon exsistiert. Wenn ja wird
diese wieder gelöscht (ist nur zur Sicherheit).<br />
Der zweite Schritt legt die Tabelle #tblTemp an und fügt die benötigten Spalten hinzu.
Hierbei bitte ich um besonderes augenmerk auf die Spalte a_id. Diese wird anschließend
unsere fortlaufende Nummer enthalten.<br />
Im Schitt 3 wird die Tabelle nun gefüllt wobei als Quelle das eigendliche Statement
ausgeführt wird.<br />
Und im Schritt 4 wird #tblTemp wieder ausgelesen.<br /><br />
Das Resultset könnte dann so aussehen:<br /><br />
a_id a_Spalte1     a_Spalte2<br />
---- ------------ ------------<br />
1     11111          Leipzig<br />
2     22222          Berlin<br />
3     33333          München<br /><br />
Zwar ist dieser weg sehr umständlich aber der einzig mir bekannte Weg.<br /><br />
Eine Möglichkeit um möglichst viele Spalten zu Select jedoch nicht alle Spalten in
der virtuellen Tabelle aufnehmen zu müssen wäre die, das man nur die Zählerspalte
(a_id) und eine ReferenzID-Spalte anleget und anschließend die Quelltabelle mit der
temporären Tabelle anhand der ReferenzID-Spalte join't.<br /><p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=74b361ac-70a0-4ac4-b05f-e67eb94acbf7" /></div>
    </content>
  </entry>
  <entry>
    <title>Temporäre Tabellen anlegen und löschen</title>
    <link rel="alternate" type="text/html" href="http://blog.freakfabrik.net/PermaLink.aspx?guid=148ccb4c-f703-4475-825c-3e1b34d23a5e" />
    <id>http://blog.freakfabrik.net/PermaLink.aspx?guid=148ccb4c-f703-4475-825c-3e1b34d23a5e</id>
    <published>2006-08-31T10:50:28.958+02:00</published>
    <updated>2006-08-31T10:51:00.2558694+02:00</updated>
    <category term="Quellcode / MSSQL" label="Quellcode / MSSQL" scheme="http://blog.freakfabrik.net/CategoryView.aspx?category=Quellcode+%7c+MSSQL" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Wer sich intensiver mit SQL beschäftigen
muss der wird hin und wieder das Problem habe das er Daten innerhalb eine Stored Procedure
Daten zwischenspeichen muss. Hierfür bieten sich temporäre Tabellen an.<br /><br />
Temporöre Tabellen sind Tabellen die nur im Speicher des SQL-Servers verfügbar sind.
Sie werden nicht langfristig auf dem SQL-Server angelegt. Es gilt dabei zwei verschiedene
Arten von temporöre Tabellen zu unterscheiden. Zum einen wären das die Sessionbeasierenden
temporäre Tabellen. Diese sind nur innerhalb einer Sitzung verfügbar bzw. können nur
innerhalb der Stored Procedure verwendet werden die sie erstellt hat. Wobei hierbei
zu beachten ist das wenn eine Stored Procedure eine anderen aufruft die aufgerufene
Stored Procedure innerhalb der Session der aufrufenden läuft und somit alle Sessionbeasierenden
temporäre Tabellen übernimmt. Eine Sessionbeasierenden temporöre Tabellen legt man
an in dem man ein # vor den Namen der Tabelle setzt.<br />
Die zweite Art von temporäre Tabellen sind die globalen temporöre Tabellen. Diese
stehen allen Statements für eine gewissen Zeitraum zur Verfügung und sind nicht abhängig
von einer Session. Eine globale temporäre Tabellen legt man an in dem man zwei ##
vor den Namen der Tabelle setzt.<br /><br />
In diesem Beispiel verwende ich Sessionbeasierenden temporöre Tabellen.<br /><br />
Hier ein Beispiel wie man eine solche Tabelle anlegt:<br /><br />
[code]/*Temporäre Tabelle "#tblTemp" anlegen<br />
create table #tblTemp(<br />
    [a_id] [int] IDENTITY (1, 1) NOT NULL ,<br />
    [a_Spalte1] [int],<br />
    [a_Spalte2] [varchar])<br />
go[/code]<br /><br />
Löschen funktioniert eben so einfach:<br /><br />
[code]/*Prüfen ob die Tabelle "#tblTemp" schon exsistiert - wenn ja löschen<br />
IF not OBJECT_ID('tempdb..#tblTemp') IS NULL 
<br />
begin<br />
    drop table [#tblTemp]<br />
end[/code]<br /><br />
Im nächsten Artikel werde ich diese temporären Tabellen verwenden um einem Resultset
eines Select-Stament eine Vortlaufenden Nummer zuzuweisen.<br /><br /><br /><p></p><img width="0" height="0" src="http://blog.freakfabrik.net/aggbug.ashx?id=148ccb4c-f703-4475-825c-3e1b34d23a5e" /></div>
    </content>
  </entry>
</feed>