|
[30] Shibu
投稿日:2004/02/27(Fri) 12:07 |
[関東] |
|
|
こんにちは、wing さん。
書き込みありがとうございます。
Oracle、DB2は業務で使ったことはありますが、実際の
SQLの操作などはやったことがありません(大汗。
基本的にはAccessやParadoxなどと同じ(SQLは結構方言
がある)だとは思います。
分からないことは、私も調べますので(広範囲な質問
に答えるのは難しいと思いますが)、いっしょに勉強
していきましょう。 |
[29] wing
投稿日:2004/02/27(Fri) 00:15 |
[関東] |
|
|
はじめまして。
プログラムのサイトめぐりをしていたら
ここにたどり着きました(^^
データベースの話題が掲示板にあったので
私も書き込みしたい〜、と思って書いてしまいました。
Access使いたいんですが、私のパソコンには
入ってないので、Oracleを使っているんですよ。
まあ、まだまだ未熟ですが(汗
それに伴って、SQLを勉強しているので、
今度質問させていただくかもしれませんので
よろしくお願いします。
|
[28] DB素人
投稿日:2004/02/20(Fri) 10:49 |
[近畿] |
|
なるほど、すっきりしました。Query1とPhraseTableはBDEを通じて間接的につな
がっていたのですね。ありがとうございました。 |
[27] Shibu
投稿日:2004/02/19(Thu) 20:16 |
[関東] |
|
|
こちらもごめんなさい。
質問:
拡張子がないのになぜQuery1がPhrase.db見つけてくるか? ですよね。
答え:
ローカル SQL
では、テーブル名を二重引用符などで囲むとパスや拡張子を
含んだ指定ができます。
SELECT * FROM "Phrase.db" //Paradox
や
SELECT * FROM "C:\\test\\Keyword.dbf" //dBase
など。
それとは逆に、今回のように拡張子を省略すると、BDEの環境設定で指定
されたテーブルタイプ・問い合わせ・テーブルに関連付けられたエリアスの
デフォルトドライバのタイプなどと見なされるようです。
ですから、DB素人さんの言うように、
>"Phrase"(拡張子なし)を探し、無ければ次は"Phrase.db"を探し...の
>ようなことをやっているとか、そういうことなのだろうなとは思うのですが、
に近いと思います。
試しにコードをちょっといじってコンパイルさせてみましたが、
Phrase.db
Phrase.dbf
Phrase.txt
が見当たりませんと言う意味のエラーが出力されました。
順番に見てきてる感じですね。 |
[26] DB素人
投稿日:2004/02/19(Thu) 12:35 |
[近畿] |
|
解説ありがとうございます。
すみません。質問の仕方が悪かったようです。
私の関心は、TQueryがテーブルPhraseを見つけるメカニズムにあったのです。
つまり、なぜ、Query1は、"Phrase"でも"Phrase.dbf"でも"Phrase.txt"でもなく、
"Phrase.db"をテーブルとして選ぶのか、です。
Query1は、PhraseTableとPhrase.dbの関係を知らないはずだし、そもそもQuery1
は自身がPhraseTableが同時に存在していることすら意識していないはず。そう考
えるとQuery1がPhrase.dbを選べることがとても不思議に思えるのです。
質問の連発ですみません。 |
[25] Shibu
投稿日:2004/02/19(Thu) 07:47 |
[関東] |
|
|
TTableコンポーネントはデータベーステーブルを直接指定(BDE経由)することで、
テーブルのレコードにアクセスします。
TQueryコンポーネントはSQL文を使って複数テーブルを処理することができます。
DB素人さんの言うように"FROM Phrase"がポイントです。
SQLは、データベースでデータを抽出したり、更新したりを行うための言語で、
基本構文が、SELECT <列名> FROM <表名> WHERE
<条件>のようになっています。
FROM <表名>
にテーブル名(複数可)を入れることで<列名>で指定したデータを
取得してくれます(詳細はSQLの書籍にあたってください。奥が深いです)。
ですからひとつのテーブルを扱うのであれば、TTableでもTQueryでもどちらでも
かまいません。
単純に言うと、ひとつのテーブルならTTable、複数ならTQueryを使う、でしょうか。
TTableはTableNameプロパティにテーブル名を指定する。
TQueryはSQLプロパティを使って各テーブルにアクセスする。
という使い方です。 |
[24] DB素人
投稿日:2004/02/18(Wed) 12:45 |
[近畿] |
|
コンポーネントの設定と、ソースコードから、オブジェクトの関連図を描いて、
サンプルの内容は、ほぼ理解できました。
# .DBや.PX、.VALをダンプで覗いてみたりするのも面白かったです
:-)
ただ、1点だけ、不安なところがあります。
Query1: TQueryは、DatabaseNameプロパティにパスを設定しただけなのに、
どうやらPhrase.db(テーブル)にアクセスできるようです。
TMainForm::MakeSQL()で、"FROM Phrase"としている辺りがヒントで、例えば、
"Phrase"(拡張子なし)を探し、無ければ次は"Phrase.db"を探し...のようなことを
やっているとか、そういうことなのだろうなとは思うのですが、
TTable::TableNameは、任意に設定できる様なので、その辺りがどうもモヤモヤし
ています。
もしよければ、もう少し教えてください。
よろしくおねがいします。 |
[23] DB素人
投稿日:2004/02/17(Tue) 19:04 |
[近畿] |
|
無事、動作を確認しました。
私の中でバラバラだったDBコンポーネントたちが、おぼろげながらつながりを持
ち始めました。#これが一番よかったことです
しばらくこれで遊んでみます :-)
ありがとうございました。 |
[22] Shibu
投稿日:2004/02/17(Tue) 12:20 |
[関東] |
|
|
DB素人さん、こんにちは。
書き込みありがとうございました。
確認しました。
TIndexOptionsのSetの部分、DB素人さんのおしゃるように
<<(CreateTable()をixPrimary)ですね。
そして、次のコードとしてCreateTable()が必要になります。
以下のように修正・追加してみてください。
【修正・追加】
PhraseTable->IndexDefs->Add("",
"PhraseNo",
TIndexOptions()
<< ixPrimary
<< ixUnique);//修正
//必要な内容を指定したので,Phraseテーブルを作成する
PhraseTable->CreateTable();//追加
※Keywordテーブルも同様に修正・追加をお願いします。
KeywordTable->IndexDefs->Add("",
"Keyword",
TIndexOptions()
<< ixPrimary
<< ixUnique);//修正
//必要な内容を指定したので,Keywordテーブルを作成する
KeywordTable->CreateTable();//追加
以上です。
サイトの方は早急に修正しておきます。
初めてプログラムを作っている時に解説が間違っている事ほど、
作成者を混乱されることはないですよね。
私も何度も経験しているのでよく分かります。
多分、時間を掛けて悩んでしまったことでしょうね。
大変、申し訳ありませんでした。
また何かありましたら、遠慮しないで連絡してください。
DB素人さん、ごめんなさいでした。 |
[21] DB素人
投稿日:2004/02/16(Mon) 17:17 |
[近畿] |
|
はじめまして、DBアプリ入門に(5)データベースなんて作れる?の記事を参考
にさせていただいています。DBアプリは全く初めてなので、フォームにコンポーネ
ントを貼り付けてプロパティを設定するだけでも随分参考になりました。ありがと
うございます。
# 環境: BCB5(Pro) + UpdatePack1 / Windows2000
ひととおり入力が終わったのですが、TMainForm::FormCreate()に1箇所コンパイ
ルが通らないところがあります。コードの中ほどにあるこの行なのですが、
>PhraseTable->IndexDefs->Add("",
"PhraseNo", TIndexOptions() < CreateTable());
TIndexOptionsはSetなので、<が<<なのにはすぐ気が付いて変えてみましたがダ
メ、ヘルプを参考に、CreateTable()をixPrimaryに変えてみたらコンパイルは通り
ましたが、実行時に例外が発生してしまってダメでした。
これについて解説をいただきたいです。
よろしくおねがいいいたします。 |
|
|