Tales of Drudgery and Boredom

Michel Vuijlsteke's Weblog. Altijd al geprobeerd een dagboek bij te houden.

I've moved
My new address is http://blog.zog.org.
Not because I was immensely dissatisfied with Radio, just because TypePad is the better service. That, and Robb's Law: I don't want to have a weblog (any website really) on a domain that I don't own.

Ik ben verhuisd
Mijn nieuw adres is http://blog.zog.org.
Niet omdat ik heel erg ontevreden was van Radio, maar gewoon omdat TypePad beter is. En omdat ik er een website kan hebben op mijn eigen domeinnaam.

  zaterdag 5 april 2003

Voilà. Ik ga gaan slapen. Ik ben geradbraakt.

Bob Monkhouse's favoriete boek is His Dark Materials van Philip Pullman. Nog zo'n achtingstijger.

Aaaargh! Case sensitivity in databases! Hoe is dat in godsnaam mogelijk?!

We zijn juist terug van bij mijn moeder (mijn vader zat weer ergens ginderachter, Ljubjana deze keer, tsss), en ik dacht, I'll give this datab binding lark another go.

En what do you know? Het is onnoemelijk onnoemelijk veel gemakkelijker dan ik dacht. Gegeven een combobox cbPublisher voor een lijst uitgevers, een datatable tblBook waarin het huidige boek zit en een datatable tblPublishers met alle uitgevers:

//de combobox een datasource geven
cbPublisher.DataSource=tblPublishers;

//displaymember van een combobox met datasource is wat getoond wordt
cbPublisher.DisplayMember="publisher_name";

//daarmee overeenkomend: valuemember, 't zelfde als value in een (html-)<option>
cbPublisher.ValueMember="publisher_ID";

//hey presto! selectedvalue verbinden met book_publisher_id uit tblBook
cbPublisher.DataBindings.Add("SelectedValue", tblBook, "book_publisher_ID");

En dat is het. Dat is àlles! Werkt direkt van de eerste keer, werkt perfect, doet wat het moet doen, prachtig. Sweet Jesus!

Enfin ja, alles, een groot woord. Ik heb dan nog een goeie drie kwartier zitten zoeken waarom het niet wou werken als ik er een tweede combobox aan toe wou voegen:

cbCover.DataSource=tblCovers;
cbCover.DisplayMember="cover_type";
cbCover.ValueMember="cover_ID";
cbCover.DataBindings.Add("SelectedValue", tblBooks, "book_cover_ID");

Zucht, driedubbel zucht. Vieze fouten, in de zin van "Could not bind to the new value member", en dan misleidende dingen over het internet verspreid vinden, bah.

Die brol is verdomme case sensitive!! Nu ja, figures eigenlijk wel: die dataset (eum, DataSet eigenlijk dus :) is geen database maar een XML-dinges, en XML is nu eenmaal case sensitive. Het was dus gewoon dat cover_ID moest vervangen worden door cover_id. En nu werkt het gelijk een lierken:

Morgen doe ik de rest van die databound controls.

Laurence Llewellyn-Bowen's favoriete boek is Frankenstein, de man stijgt in mijn achting.

Waar een beetje rust en een klaar hoofd allemaal niet goed voor zijn: die DataSet-historie met meer tabellen, 't is eigenlijk toch niet zo ingewikkeld.

OleDbDataAdapter da;
DataSet dsBook=
new DataSet("Book");

da=
new OleDbDataAdapter("select * from tblBooks where book_id="+ID.ToString(),cnnBooks);
da.Fill(dsBook,"tblBooks");
da=
new
OleDbDataAdapter("select * from tblPublishers",cnnBooks);
da.Fill(dsBook,"tblPublishers");
richTextBox2.Text="";
foreach (DataTable dt in
dsBook.Tables)
{
   richTextBox2.Text+="table: "+dt.TableName+"\n";
   foreach (DataColumn dc in
dt.Columns) 
   {
      richTextBox2.Text+="\tcolumn: "+dc.ColumnName+"\n";
   }
}

En dat geeft een proper lijste van tabellen en velden:

table: tblBooks
    column: book_ID
    column: book_title
    column: book_genre_id
    column: book_pages
    column: book_cover_ID
    column: book_year
    column: book_publisher_ID
    column: book_price
[...]
table: tblPublishers
    column: publisher_id
    column: publisher_name

En dan is 't nog een kwestie van daar een relatie aan toe te voegen:

dsBook.Relations.Add("BookPublisher",
    dsBook.Tables["tblBooks"].Columns["book_publisher_ID"],
    dsBook.Tables["tblPublishers"].Columns["publisher_id"],
    false);

En dat geeft proper schoon het volgende schema:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="Book" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
   <xs:element name="Book" msdata:IsDataSet="true" msdata:Locale="nl-BE">
      <xs:complexType>
         <xs:choice maxOccurs="unbounded">
            <xs:element name="tblBooks">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="book_ID" type="xs:int" minOccurs="0" />
                     <xs:element name="book_title" type="xs:string" minOccurs="0" />
                     <xs:element name="book_genre_id" type="xs:int" minOccurs="0" />
                     <xs:element name="book_pages" type="xs:int" minOccurs="0" />
                     <xs:element name="book_cover_ID" type="xs:int" minOccurs="0" />
                     <xs:element name="book_year" type="xs:int" minOccurs="0" />
                     <xs:element name="book_publisher_ID" type="xs:int" minOccurs="0" />
                     <xs:element name="book_price" type="xs:double" minOccurs="0" />
                     [...]
                  </xs:sequence>
               </xs:complexType>
            </xs:element>
            <xs:element name="tblPublishers">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="publisher_id" type="xs:int" minOccurs="0" />
                     <xs:element name="publisher_name" type="xs:string" minOccurs="0" />
                  </xs:sequence>
               </xs:complexType>
            </xs:element>
         </xs:choice>
      </xs:complexType>
   </xs:element>
   <xs:annotation>
      <xs:appinfo>
         <msdata:Relationship name="BookPublisher" msdata:parent="tblBooks" 
               msdata:child="tblPublishers" msdata:parentkey="book_publisher_ID"
               msdata:childkey="publisher_id" />
      </xs:appinfo>
   </xs:annotation>
</xs:schema>

Wijs! Enfin, nu zijn de kinderen terug van het zwembad. Na het eten ga ik nog eens verder kijken om die zooi in controls te krijgen en te wijzigen.

Leve Astor Piazzolla!

Een oudje maar een goedje:

L'histoire suivante est véridique (ceux qui veulent vérifier peuvent s'adresser aux affaires maritimes canadiennes, l'incident s'est passé en Octobre 1995). 

Transcription d'une communication radio entre un bateau de la US Navy et les autorités canadiennes au large de Newfoundland. 

-Américains: Veuillez vous dérouter de 15 degrés Nord pour éviter une collision. A vous. 

-Canadiens: Veuillez plutôt vous dérouter de 15 degrés Sud pour éviter une collision. A vous. 

-Américains: Ici le capitaine d'un navire des forces navales américaines. Je répète : Veuillez modifier votre course. A vous. 

-Canadiens: Non, veuillez dérouter, je vous prie. A vous. 

-Américains: ICI C'EST LE PORTE AVIONS USS LINCOLN, LE SECOND NAVIRE EN IMPORTANCE DE LA FLOTTE NAVALE DES ETATS- UNIS D'AMERIQUE. NOUS SOMMES ACCOMPAGNE PAR 3 DESTROYERS, 3 CROISEURS ET UN NOMBRE IMPORTANT DE NAVIRES D'ESCORTE. JE VOUS DEMANDE DE DEVIER DE VOTRE ROUTE DE 15 DEGRES NORD OU DES MESURES CONTRAIGNANTES VONT ETRE PRISES POUR ASSURER LA SECURITE DE NOTRE NAVIRE. A VOUS. 

-Canadiens: Ici, c'est un phare. A vous.

-Américains: silence.

Ik zie juist op CNN dat de Amerikanen zeggen dat "substantial numbers of US troops" in "central BAghdad" zouden zijn, en dat de mensen dat zouden zien "rond de middag".

Het is nu 12u27 in Bagdad, en ik hoop van harte dat de Amerikanen gelijk hebben. No way dat ik hoop dat er alsnog guerillatoestanden van komen, gewoon om te bewijzen dat de VS verkeerd waren. Oorlog is vies, en hoe sneller het gedaan is , hoe beter.

Microsoft Infopath: I didn't get it.

Now I do.

Miljaar, weer een goed ding van de mannen van Redmond.

Maar nu naar bed, morgen C#, ik moet er fris op staan, die datasets met relaties en alles moeten er echt door morgen.

Ikzelf

Nieuws & stuff Fark - Salon - BBC - Standaard - Slashdot

Mensen Graham - Bie - Neil G. - Rene - Iwein - Merel - Free - Steven - Bruno - Stijn

Boeken Bookslut - Amazon UK