Caster と申します。
初めて質問させていただきます。宜しくお願いいたします。
早速ですが、TADOTableを使用して、不可解な現象がおきました。
以下にその現象を説明します。
DBはMySQL5.0.0-alpha を使用しており、
データベース名:testDB
テーブル名 :testtable
フィールド名 :testField ( 型:VARCHAR(20) )
レコード数 :10
最大データ長 :11byte
という設定です。
ここで、TADOTable のアクティブレコードを編集する際、
testFieldに文字列"abcdefghijklm"(13Byte)を書き込む
(TADOTable.FieldByname('testField').asstring:='abcdefghijklm')
と書き込んだ結果は"abcdefghijk"となって、"lm"が省略
されます。調べた結果、
TADOTable.Fields[0].Size = 11
(TADOTable.Fields[0] = TADOTable.FieldByName('testField') )
となり、12byte目以降が省かれます。
TFieldsのメモリサイズはてっきり、データベースのフィールドサイズ
(varchar(20)=20Byte)分確保するもどだと思っていたのですが、
最大データ長分しかメモリが確保されていません。
この現象は、TADOTable の仕様なのでしょうか?
どなたか、ご教授の程宜しくお願いいたします。
[開発環境]
Delphi2005 Pro
DB : MySQL 5.0.0-alpha(MySQL ODBC 3.51 Driver DSN)
私はMySQLを殆ど使ったことが無いので詳細は分かりませんが、
> 最大データ長 :11byte
↑これって変更できないんですか?
文章読む限りですが、どう考えても、Delphiの問題というよりはDB側の問題な気しますが・・。
Casterです。
きりりさん、早速の返答ありがとうございます。
文中の「最大データ長」というのは、
テーブル[testtable]のフィールド[testField]に格納されている
データの中で、最大長がたまたま"11byte"
ということで、テーブルのフィールドの型としては最大20Byteまで
格納可能な設定となっています。
しかし、
TADOTable.Open
とした時に、TADOTableがフィールド[testField]に自動的に
割り当てるメモリのサイズが"11Byte"となってしまい、
20Byteまで格納可能なフィールドに11Byte分までしか登録できない
のが現状です。
ちなみに、TADOTable.Fields[0].Sizeの"Size"プロパティは
読み取り専用プロパティなので変更できません。
接続オプションに3を指定していないとか
http://dev.mysql.com/doc/refman/5.0/en/connection-parameters.html
FieldSizeを変更できませんか?
HOtaさんの言うとおりだと思いますが、
>20Byteまで格納可能なフィールドに11Byte分までしか登録できない
>のが現状です。
ってことであれば、20BYTE→40BYTEにするなりで解決するのでは?
仕事柄、ADOでMDBやSQL Serverに接続するシステムを開発してますが、
Casterさんのおっしゃるような現象に出くわしたことがありません。
MySQLはあまり使ったことがないので、詳しく知りませんし、確信もありませんが、
たとえばさんが言うように、MySQL側の設定の気がします。
Casterです。
お世話になっております。
たとえばさん、HOtaさん、きりりさん、
返答ありがとうおございます。
一応、この現象に対して解決いたしましたので
ご報告いたします。
まず、実験的にTADOTableではなく、TTableコンポーネント
を使用しましたところ、今までの現象は再現されませんでした。
お客様のインストール先マシン環境の関係上、
TADOTableを使用したまま、フィールドサイズの変更で
この現象を回避することにしました。
(現在、TADOTableとTTableの違いを調査中です。)
各位殿、ありがとうございました。
TADOはマイクロソフトのADOをカプセル化したもので、全面的にADOに依存しています。TTableはBDEをつかいます。BDEは5.20で開発は停止して、新しいドライバーには対応していません。ADOのバージョンを上げたらどうでしょうか?
ツイート | ![]() |