0

私は維持するためにレガシーVB6アプリを継承しました、そして私のvb6は少しさびた以上です...

タイプDAO.DataTypeEnum.dbLongに変更する必要があるタイプDAO.DataTypeEnum.dbIntegerのフィールドを持つDAOテーブルがあります。この新しいデータ型を設定して既存の値を保持するショートカットvb6の方法はありますか、またはデータを格納するための一時列を作成し、新しいデータ型で列を削除して再作成してから、手動でデータを移行する必要がありますか?

4

2 に答える 2

2

データベースエンジンがALTERTABLEALTER COLUMNをサポートしている場合、Shahkalpeshの答えは問題ありません。Accessデータベースエンジン(Jet .mdb、ACE .accdbなど)を使用している場合は、ANSI-92クエリモード(Jet4.0およびAccess2002以降)でALTERCOLUMNを使用できます。

過去に私は完全にコードを通してこのようにそれをしました。以下のコードは、ALTERCOLUMNを使用せずに文字列フィールドを浮動小数点doubleに変換します。別の名前と正しいデータ型で新しいフィールドを作成し、データをコピーして元のフィールドを削除し、新しいフィールドの名前を元の名前に変更します。これを簡単に適応させて、整数から長整数にすることができます。

  Dim fld As DAO.Field

  ' Cant just change the type of an existing field. '
  ' Instead have to create the new field with a temporary name, '
  ' fill it with the required data, delete the old MyField field '
  ' and then rename the new field. The renaming has to be done '
  ' with DAO - cant do it through SQL '

  ' Add TEMP_MyField field: required double field. Will be renamed later '
  sSQL = "ALTER TABLE MyTable " & _
         "ADD COLUMN TEMP_MyField DOUBLE NOT NULL "
  dbDatabase.Execute sSQL, dbFailOnError

  ' Copy the MyField values to the TEMP_MyField field '
  sSQL = "UPDATE MyTable SET TEMP_MyField = CDbl(MyField)"
  dbDatabase.Execute sSQL, dbFailOnError

  ' Delete the original MyField field (the text field) '
  sSQL = "ALTER TABLE MyTable DROP COLUMN MyField"
  dbDatabase.Execute sSQL, dbFailOnError

  ' Need to refresh the TableDefs to make sure new field shows up '
  dbDatabase.TableDefs.Refresh

  ' Get a reference to the temporary MyField field we just created '
  Set fld = dbDatabase.TableDefs("MyTable").Fields("TEMP_MyField")

  ' Rename it to the final name we want it to have '
  fld.Name = "MyField"
于 2009-07-21T13:07:41.177 に答える
1

これが1回限りのジョブである場合は、Accessデータベースを開いて、データ型を変更できます。
それ以外の場合は、この投稿にコメントを追加してください。

編集:データベースオブジェクトに対してALTERステートメントを発行できます

CurrentDb.Execute "ALTER TABLE myTable ALTER Column myIntegerColumn Long"
于 2009-07-20T21:02:27.793 に答える