Archives for April, 2006

22
Apr

Deploying the ASP.NET application which is using Firebird .NET Data Provider (with design-time support)

A few days ago I was trying to deploy my web app, which is using Firebird .NET Data Provider with design time stuff too. There was some problem with this, so I’ve created small how-to.

If you just use FirebirdClient “in code”, you can just place the dll into the Bin directory of your web app. But if you use the design time support, you have to do some additional steps.

First check, whether you have FirebirdSql.Data.FirebirdClient.dll in your Bin directory and if you have setted the reference to it. :)

Next open your web.config and add the record of <DbProviderFactories>. It’s similar to adding design time support into VS.
The record should be like this (example of mine; be sure have right setted the ‘type’ attribute):

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <system.data>
    <DbProviderFactories>
      <add name="FirebirdClient Data Provider" invariant="FirebirdSql.Data.FirebirdClient" description=".Net Framework Data Provider for Firebird" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c" />
    </DbProviderFactories>
  </system.data>
</configuration>

After adding this, your app should be able to use not only “code time” Firebird, but also the “code” from design time (i.e. configured SqlDataSource).

If you have any perception to this topic, let me know!

20
Apr

Creating Firebird database programatically (C#/.NET)

Well, after Creating Firebird database programatically (Delphi) post I’m bringing the example “How to create FB database programatically from .NET?”.
The solution is easy too. :) You can just use (and also extend) this simple function. It uses the Firebird ADO.NET Data Provider.


static void CreateFBDatabase(string host, string fileName, string user, string password,< ?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

int pageSize, bool forcedWrites, bool overwrite)

{

FbConnectionStringBuilder csb = new FbConnectionStringBuilder();

csb.Database = fileName;

csb.DataSource = host;

csb.UserID = user;

csb.Password = password;

FbConnection.CreateDatabase(csb.ConnectionString, pageSize, forcedWrites, overwrite);

}


18
Apr

Creating Firebird database programatically (Delphi)

Today my colleague asked me the question, “How to create FB database programatically from Delphi?”. Well, the solution is very easy, just use the following code (it’s using the InterBase Express components):


IBDatabase1.DatabaseName := ChangeFileExt(Application.ExeName, ‘.fdb’);
IBDatabase1.Params.Add(‘USER ”SYSDBA”’);
IBDatabase1.Params.Add(‘PASSWORD ”masterkey”’);
IBDatabase1.Params.Add(‘PAGE_SIZE 4096′);
IBDatabase1.Params.Add(‘DEFAULT CHARACTER SET WIN1250′);
IBDatabase1.CreateDatabase;

10
Apr

Referencuji, referencuješ, referencujeme

A máme to tu zas. Mám na to prostě asi štěstí. Databáze “naklikávám” podle čmáranic v GUI (je to pohodlnější, neboť to umí ledacos doplnit). Jenže jak to něco doplňuje, něco se přehlédne.

Během ladění kódu (mj. hraju si teď s ASP.NET a je to zajímavé) mi to vyhazovalo FormatException na ExecuteNonQuery. Byl jsem z toho celkově zmatený a divil jsem se, že nedostávám nějaké přesnější info. Když jsem všechno několikrát prošel, zakomentoval, odkomentoval a stále nic, udělal jsem (pro mě) poslední pokus. Zapsal jsem insert přímo do zadání. A hle, hned jsem uviděl, kde to nesedí.

A právě tady mě GUI vypeklo. Jak jsem tam ládoval tabulky, u jedné jsem u FK nechal přednastavený integer, kdežto nadřazená tabulka byla varchar(32).

Ach jo, taková kravina a človek s tím stráví skoro hodinu času.

9
Apr

Fórum nebo mailing-list?

V několika posledních týdnech jsem instaloval na některé stroje nové verze různého SW. A jak to při správném upgradu chodí, vždy něco nefungovalo.
To mě přivedlo na myšlenku, jestli je lepší pro podpru uživatelů mailing-list nebo fórum. Pokud má SW fórum, je to obecně mnohem přístupnější. Čtení i psaní dotazů je velmi jednduché a dobře se prohledává. Problémem je ale většinou kvalita, obsahuje často mnoho “vaty”. Také pokud chcete náhodou toto odebírat mailem (např. se o to zajímáte) nemá pro mail většina fór podporu.
Naproti tomu mailing-list má většinou lepší úroveň, povětšinou se dá najít i archiv a prohledat (ale ne vždy). Horší je to s položením dotazu, není to tak přímočaré. Výhodou je však možnost (díky podstatě fungování) odebírat jej mailem.

Nevím jak ostatní, ale pokud něco hledám, mám rád, když má SW mailing-list s archivem na webu. Pokud už pak nenajdu co potřebuju, není problém se přihlásit a dotaz položit (a později – je-li třeba – se zase odhlásit).

A co vy? Co máte raději?

2
Apr

Zabalení souborů do jednoho (hackneme serializaci?) :)

Tento týden na cvikách z C# (BTW první cvika co vypadala slušně – ale učí se to první rok, tak se teprve učí jak na to) bylo v rámci procvičení práce se streamy za úkol udělat program, který všechny soubory z daného adresáře (nebo spíše soubory, které tam vložíte) nacpe do jednoho a uloží.
Jako další bylo na procvičení něco málo kolem serializace. No a co moje hlava nevymyslela, spojil jsem toto dohromady. Udělal jsem tedy třídu, která všechny soubory vložila “do sebe” (spíše tedy do Dictionary) a pak jsem ji nechal seserializovat.
Přemýslím akorát teď jestli je to hnusné nebo hodně hnusné řesení. :) Ale co, aspon jsem zabil dvě mouchy jednou ránou a nenudil se.

Nepředpokládám, že je to celé dobře, nějak pořádně jsem to netestoval, hlavně že to jednou udělalo co jsem chtěl. Určitě by se to dalo vylepšit na nějaký tar a třeba ješte to celé prohnat kompresí.
Tady je teda tento hack pro inspiraci:


class Archive< ?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

{

private Dictionary<string, byte[]> _packItems;

public Archive()

{

_packItems = new Dictionary<string, byte[]>();

}

public void AddFile(string fileName)

{

if (_packItems.ContainsKey(fileName))

{

throw new FileAlreadyInArchiveException();

}

_packItems.Add(fileName, new PackItem(fileName).Data);

}

public void RemoveFile(string fileName)

{

if (_packItems.ContainsKey(fileName))

{

throw new FileNotInArchiveException();

}

_packItems.Remove(fileName);

}

public void Pack(string fileName)

{

BinaryFormatter bf = new BinaryFormatter();

FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);

bf.Serialize(fs, _packItems);

fs.Close();

}

public void UnPack(string directory, string fileName)

{

BinaryFormatter bf = new BinaryFormatter();

FileStream fs = new FileStream(fileName, FileMode.Open);

_packItems = (Dictionary<string, byte[]>)bf.Deserialize(fs);

foreach (KeyValuePair<string, byte[]> o in _packItems)

{

new BinaryWriter(new FileStream(directory + Path.GetFileName(o.Key), FileMode.CreateNew))

.Write(o.Value);

}

fs.Close();

}

}

class PackItem

{

private byte[] _data;

< /SPAN>

public PackItem(string fileName)

{

BinaryReader br = new BinaryReader(new FileStream(fileName, FileMode.Open));

try

{

_data = new byte[new FileInfo(fileName).Length];

_data = br.ReadBytes(_data.Length);

}

finally

{

br.Close();

}

}

public byte[] Data

{

get

{

return _data;

}

}

}



PS: Prosím neověřovat moc návrh (a ani nezkoušet kde se to zhroutí, vidím to tam), napsal jsem to jen jako hračku za asi 20 minut, jen abych zkusil, jestli to bude fungovat.