Visual Basic5.0(SP3)を使用しています。
DAO3.5を使用してAccess97で作成したテーブル(既にレコードが登録されているテーブル)のフィールドのデータ型を変更したいのですが、方法はありますか?
例えば、整数型(Integer)を長整数型(Long)にといったように...。

FieldオブジェクトのTypeプロパティにセットしようとしたのですが、読み取り専
用のためできません。

トピックで
「Visual Basic の中で、DAO の Type プロパティを使って、フィールドを
Fields コレクションに追加する前に、データ型を設定できます。」
と書かれてあるのを見つけました。と言う事は変更できないのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (5件)

対象となるテーブルを再作成してよいのなら、


テーブル作成クエリーを使うとかなり楽です。

例)
元テーブル<TB1>
項目 :データ型
TEST1:Char
TEST2:Integer
TEST3:Binary

実行SQL
SELECT TB1.TEST1,
CSTR(TB1.TEST2) as TEST2, CINT(TB1.TEST3) as TEST3
INTO TB2 FROM TB1;

作成後テーブル<TB2>
項目 :データ型
TEST1:Char
TEST2:Char
Test3:Integer

で、元のテーブルをDeleteすればOK

実際の運用を考えると、テーブル名を変えたくないので、
元テーブルの名前を変えてから、新テーブルを元の名前で作成するか、
作った後から名前を変えるかしてください。

ただし、一時的にせよmdbの中で同一データのテーブルが2つになるので、
データが大量にあるテーブルの場合には、この方法はあまりお勧めしません。

はずしてたらすいません。^^;
    • good
    • 0
この回答へのお礼

ありがとうございます。
さっそく試します。

お礼日時:2001/09/17 09:06

以下のようにすればどうでしょうか?



1.対象のテーブルのTableDefオブジェクトよりフィールド
 情報を取得する。
2.DatabaseオブジェクトからテーブルをDeleteする。
3.TableDefsオブジェクトを新規に作成する。
4.1の情報を設定する。(この時フィールド型を変更)
5.DatabaseオブジェクトにTableDefsオブジェクトをAppendする。

一度、試して見て下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。

お礼日時:2001/09/17 09:07

すみません。

質問をちゃんと読んでいませんでした。
オラクルでやってたことですので、DAOでできるのか分かりません。
失礼しました。(はずかしー)
    • good
    • 0

こんにちは。


SQL文ではダメでしょうか。(^^;

1.新テーブルの作成
create table 新テーブルの別名 (・・・);

2.データ移植
insert into 新テーブル別名 (select * from 元テーブル);

3.元テーブル削除
drop table 元テーブル;

4.データ移植
create table 新テーブル as (select * From 新テーブルの別名);

または、

create table 新テーブル (・・・);
insert into 新テーブル (select * from 新テーブルの別名);


的を得ていなかったらごめんなさい。m(_ _)m
    • good
    • 0

Adoでも使うのですが、


String関数や、Cint関数を使ってみるのは、どうでしょう?
私自身、仕事でよく使ってますけど、例えばsqlでそのテーブルでのMax値を取ってきて、Cint関数で数値型にして欲しいデータを生成したりしてます。

関数に関しては、分かりますか?日付を生成したりする関数なんかもあるので、関数を知っていれば、便利ですよ!
\(^o^)/

この回答への補足

お返事ありがとうございます。
ちょっと質問の内容があいまいでしたので補足します。
ACCESSのテーブルのフィールド定義そのものを変更したいのです。
と言いますのは、仕事で開発したシステムで、当初、あるフィールドを「整数型」で定義していたのですが、後に「長整数型」の数値を格納しなくてはならなくなり、フィールド定義の変更が必要になってきました(システムを収めた客先全てでです)。
新しいテーブルを作成し、そこにデータを移行してもいいのですが、簡単にフィールド定義を変更できれば手間や、ミスを防げます。
よろしくお願いします。

補足日時:2001/09/13 09:22
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVisual Basic 2005でのLabelのプロパティ

現在、あるプログラムを作成中です。
Labelを作成してそのLabelの文字位置を右寄せにすることは可能でしょうか?
プロパティやヘルプを探してみたのですが見当たりません。

Visual Basic 6の時代にはそういうプロパティがあった気がするのでないはずはないと思います。

わかる方はよろしくお願いします。

Aベストアンサー

LabelコントロールのAutoSizeプロパティがFalseであることを前提に
TextAlignプロパティを使って下さい

http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.label_members(VS.80).aspx

Qinteger型、long型、double型

vb6.0についてお聞きいたします。
こちらの問題は、visual studio 2005のvbでは生じません。

windows xp上で動かしているのですが、どうやら
何もしていないあるパラメータに32000ぐらいの数字よりも大きな
数字をいれるとエラーになってしまいます。

それも、integer型、long型、double型のすべての型で生じます。
そういうものなのでしょうか?
HPをいろいろ見ましても、long型で20億ぐらいは
表現できるように書いてあるのですが。

Aベストアンサー

手元のExcel VBA(VB.NET系ではなくVB6系)で実験してみました
LongとDouble共に再現しません。
Integerの場合
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200304_03040036.html

>VB6ではIntegerが16bit、Longが32bitでしたが、
NETではIntegerが32bit、Longが64bitに変更されてますので。

割と有名ではあるんですが、Microsoft公式の文書を探すのが面倒くさいので放置。(2^16)/2 - 1 = 32767(正と負があるから。VB6のIntegerは-32768~32767しか取れない)
==============================
Option Explicit

Sub hoge()

Dim a As Long

a = 33000
MsgBox (a)


End Sub
===========================
Option Explicit
Sub hoge2()

Dim a As Double

a = 33000
MsgBox (a)


End Sub
=====================
Option Explicit
Sub hoge3()

Dim a As Integer

a = 33000
MsgBox (a)


End Sub

手元のExcel VBA(VB.NET系ではなくVB6系)で実験してみました
LongとDouble共に再現しません。
Integerの場合
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200304_03040036.html

>VB6ではIntegerが16bit、Longが32bitでしたが、
NETではIntegerが32bit、Longが64bitに変更されてますので。

割と有名ではあるんですが、Microsoft公式の文書を探すのが面倒くさいので放置。(2^16)/2 - 1 = 32767(正と負があるから。VB6のIntegerは-32768~32767しか取れない)
==============================
Option Ex...続きを読む

QVisual CのコードをVisual Basicに直したいです

検索でVCのコードしか見つからず、VBに直しているのですが、下記がわかりません。

[VC]
public ExtendedWebBrowserSite(ExtendedWebBrowser wb) : base(wb)
{
parent = wb;
}

下記のところまでは、出来たのですが、最後の「 : base(wb)」の部分はどのようにすればよいのでしょうか?
[VB]
Public Sub ExtendedWebBrowserSite(ByVal wb As ExtendedWebBrowser)
parent = wb
End Sub

ご存知の方、よろしくお願いいたします。

Aベストアンサー

Convert C# to VB.NET
http://www.developerfusion.com/tools/convert/csharp-to-vb/

QInteger型をString型に

Integer型をString型にするにはどうしたらいいんですか?

Aベストアンサー

VB、VBAなら
CStr(変数名)

VB.NETなら
変数名.ToString()
も使えます。

参考URL:http://santamartadotnet.hp.infoseek.co.jp/documents/vbdotnetbasic/04_conversion.html

QAccessのDAOでフィールド名を配列に格納して・・・

Access2000のDAOで下記のようなコードで複写元テーブルから複写先テーブルにデータを追加するとします。

Set Rs1 = Db.OpenRecordset("複写元", dbOpenTable)
Set Rs2 = Db.OpenRecordset("複写先", dbOpenTable)

Do Until Rs1.EOF
Rs2.AddNew
Rs2!FL1 = Rs1!名前
Rs2!FL2= Rs1!性別
Rs2!FL3= Rs1!郵便番号
Rs2!FL4= Rs1!住所
   ・
   ・
Rs2! FL50= Rs1! 50番目
Rs2.Update
Rs1.MoveNext
Loop

複写元のフィールドが50フィールドもあると、いちいちRs1!名前とかRs1!性別とか記述するのが大変ですし、ものすごく長いコードになります。そこで、配列にしてやったらどうだろうかとこんなことをしてみましたがだめでした。

Dim I
Dim FieldsName
FieldsName=Array("名前","性別",・・・"50番目")
           ・
           ・
Do Until Rs1.EOF
Rs2.AddNew
For I=0 To 49
Rs2!フィールド(I) = Rs1!FieldsName(I)
Next
Rs2.Update
Rs1.MoveNext
Loop

じゃあTebleDifのTd.Fields().Nameを使って・・・・やっぱり失敗しました。

For I=0 To 49
Rs2!フィールド(I) = Rs1!Td.Fields(I).Name
Next

やりたいこと分かっていただけますでしょうか?要するにフィールド名を配列の様なもので格納しておいて、レコードの追加時に50回ループさせてRS2のフィールドにいれたいのです。何か良い方法は無いでしょうか。

Access2000のDAOで下記のようなコードで複写元テーブルから複写先テーブルにデータを追加するとします。

Set Rs1 = Db.OpenRecordset("複写元", dbOpenTable)
Set Rs2 = Db.OpenRecordset("複写先", dbOpenTable)

Do Until Rs1.EOF
Rs2.AddNew
Rs2!FL1 = Rs1!名前
Rs2!FL2= Rs1!性別
Rs2!FL3= Rs1!郵便番号
Rs2!FL4= Rs1!住所
   ・
   ・
Rs2! FL50= Rs1! 50番目
Rs2.Update
Rs1.MoveNext
Loop

複写元のフィールドが50フィールドもあると、いちいちRs1!名前とかRs1!性別とか記述す...続きを読む

Aベストアンサー

#2です。

一応自分なりにコードを作ってみました。

Dim I As Integer, Db As Database, Rs1 As Recordset, Rs2 As Recordset

Set Db = CurrentDb
Set Rs1 = Db.OpenRecordset("複写元")
Set Rs2 = Db.OpenRecordset("複写先")

Do Until Rs1.EOF
Rs2.AddNew
For I = 0 To 49
Rs2.Fields(I).Value = Rs1.Fields(I).Value
Next
Rs2.Update
Rs1.MoveNext
Loop
Rs2.Close
Rs1.Close
Set Rs2 = Nothing
Set Rs1 = Nothing
Set Db = Nothing

でいいと思います。ただし、前提条件として、テーブル「複写先」を作っていないとできませんが。

ご参考までに。


このカテゴリの人気Q&Aランキング

おすすめ情報