SQL Server2005DBからAccess97.mdbファイルにデータをエクスポートする必要があります。それを必要とするクライアントは、それをインポートするシステムがAccess 97ファイル形式を必要とするため(私を始めないでください)、Access97である必要があります。SQLまたは.Net(またはVB6またはRubyまたはPython ..)から昔ながらのAccessファイルを作成する方法について何か提案はありますか?
よろしくお願いします、リー
SQL Server2005DBからAccess97.mdbファイルにデータをエクスポートする必要があります。それを必要とするクライアントは、それをインポートするシステムがAccess 97ファイル形式を必要とするため(私を始めないでください)、Access97である必要があります。SQLまたは.Net(またはVB6またはRubyまたはPython ..)から昔ながらのAccessファイルを作成する方法について何か提案はありますか?
よろしくお願いします、リー
Sql2005に任せます。
Sql Management Stuidioで、ソースデータベース、[タスク]、[データのエクスポート]の順に右クリックします。これを使用して、プロンプトに従うだけで、Accessデータベースに直接エクスポートできます。または、Accessに入れるために使用できるファイル形式に出力することもできます。
必要なことは、インストールした Access バージョンに関係なく、Access ファイルにエクスポートすることです (2000...2003 である限り、Access 2007 は Access 97 ファイルに書き込めません)。あなたはすでにこれを行う方法を知っていると思います。
次に、COM 経由で Access オブジェクトを作成し、新しい .mdb ファイルを新しい Access 97 データベースに変換するように要求できます。VBScript では、コードは次のようになります (VBA、VB.Net、または別の言語を使用している場合は、必要に応じて調整してください)。
const acFileFormatAccess97 = 8
dim app
set app = CreateObject("Access.Application")
app.ConvertAccessProject "y:\mydatabase.mdb", "y:\mydatabase97.mdb", acFileFormatAccess97
Access 97 がインストールされている場合、そのバージョンの Access には ConvertAccessProject 関数がなかったため、上記のコマンドは機能しません。もちろん、その場合でもファイルを変換する必要はありません。
これは素晴らしい質問です!私は実際にこの種のことをプログラムで実行できるようにしたかったのですが、過去にはそれを思い付くのに苦労しただけでした。ただし、長年にわたって.NETスキルが少し成熟しているので、コンソールアプリとして実行できるソリューションの作成を試してみようと思いました。これは、WindowsサーバーまたはSQLサーバー(SQL Serverエージェントを使用)でスケジュールされたタスクとして実装できます。次のコードがないとSQLServerからこれを自動化できない理由はわかりませんが、これは本当に楽しかったので、そこに配置する必要があります。SqlとAccessの両方のテーブルは、ID、名前、品種、色を含む犬のリストです。一般的なもの。これは実際には、SQL ServerのローカルインスタンスとAccess(2007)の間のデスクトップで機能しますが、なぜそれが97で動作しないのかわかりません)。お気軽に批評してください。
ところで、次のようになります。
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
ここ:
static void Main(string[] args)
{
SqlConnectionStringBuilder cstrbuilder = new SqlConnectionStringBuilder();
cstrbuilder.DataSource = "localhost";
cstrbuilder.UserID = "frogmorton";
cstrbuilder.Password = "lillypad99";
cstrbuilder.InitialCatalog = "Dogs";
SqlConnection sconn = new SqlConnection(cstrbuilder.ToString());
sconn.Open();
SqlCommand scmd = new SqlCommand("select * from Dogs", sconn);
SqlDataReader reader = scmd.ExecuteReader();
if (reader.HasRows)
{
OleDbConnectionStringBuilder sb = new OleDbConnectionStringBuilder();
sb.Provider = "Microsoft.Jet.OLEDB.4.0";
sb.PersistSecurityInfo = false;
sb.DataSource = @"C:\A\StackOverflog\DogBase.mdb";
OleDbConnection conn = new OleDbConnection(sb.ToString());
conn.Open();
OleDbCommand cmd = new OleDbCommand("Delete from Dogs", conn);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
conn.Close();
OleDbConnection conn2 = new OleDbConnection(sb.ToString());
conn2.Open();
OleDbCommand icmd = new OleDbCommand("Insert into dogs (DogID, DogName, Breed, Color) values ({0}, '{1}', '{2}', '{3}');", conn2);
icmd.CommandType = CommandType.Text;
while (reader.Read())
{
string insertCommandString =
String.Format("Insert into dogs (DogID, DogName, Breed, Color) values ({0}, '{1}', '{2}', '{3}');"
, reader.GetInt32(0)
, reader.GetString(1)
, reader.GetString(2)
, reader.GetString(3)
);
icmd.CommandText = insertCommandString;
icmd.ExecuteNonQuery();
}
conn2.Close();
}
sconn.Close();
}
これを行う最善の方法は、PInvokeCREATE_DBV3
を使用することです。パラメータをSqlConfigDataSource()に渡す必要があります。これは、私の OSS プロジェクト PlaneDisaster.NET のJetSqlUtil.csから取得したコードです。
#region PInvoke
private enum ODBC_Constants : int {
ODBC_ADD_DSN = 1,
ODBC_CONFIG_DSN,
ODBC_REMOVE_DSN,
ODBC_ADD_SYS_DSN,
ODBC_CONFIG_SYS_DSN,
ODBC_REMOVE_SYS_DSN,
ODBC_REMOVE_DEFAULT_DSN,
}
private enum SQL_RETURN_CODE : int
{
SQL_ERROR = -1,
SQL_INVALID_HANDLE = -2,
SQL_SUCCESS = 0,
SQL_SUCCESS_WITH_INFO = 1,
SQL_STILL_EXECUTING = 2,
SQL_NEED_DATA = 99,
SQL_NO_DATA = 100
}
[DllImport("ODBCCP32.DLL",CharSet=CharSet.Unicode, SetLastError=true)]
private static extern int SQLConfigDataSource (int hwndParent, ODBC_Constants fRequest, string lpszDriver, string lpszAttributes);
[DllImport("ODBCCP32.DLL", CharSet = CharSet.Auto)]
private static extern SQL_RETURN_CODE SQLInstallerError(int iError, ref int pfErrorCode, StringBuilder lpszErrorMsg, int cbErrorMsgMax, ref int pcbErrorMsg);
#endregion
internal static string GetOdbcProviderName()
{
if (string.IsNullOrEmpty(OdbcProviderName))
{
var odbcRegKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\ODBC\\ODBCINST.INI\\ODBC Drivers", false);
var drivers = new List<string>(odbcRegKey.GetValueNames());
if (drivers.Contains("Microsoft Access Driver (*.mdb, *.accdb)"))
{
OdbcProviderName = "Microsoft Access Driver (*.mdb, *.accdb)";
}
else if (drivers.Contains("Microsoft Access Driver (*.mdb)"))
{
OdbcProviderName = "Microsoft Access Driver (*.mdb)";
}
else
{
//TODO: Condider checking for 32 versus 64 bit.
//TODO: Find a better exception type. http://stackoverflow.com/questions/7221703/what-is-the-proper-exception-to-throw-if-an-odbc-driver-cannot-be-found
throw new InvalidOperationException("Cannot find an ODBC driver for Microsoft Access. Please download the Microsoft Access Database Engine 2010 Redistributable. http://www.microsoft.com/download/en/details.aspx?id=13255");
}
}
/// <summary>
/// Creates an Access 2003 database. If the filename specified exists it is
/// overwritten.
/// </summary>
/// <param name="fileName">The name of the databse to create.</param>
/// <param name="version">The version of the database to create.</param>
public static void CreateMDB (string fileName, AccessDbVersion version = AccessDbVersion.Access2003) {
;
if (File.Exists(fileName)) {
File.Delete(fileName);
}
string command = "";
switch (version)
{
case AccessDbVersion.Access95:
command = "CREATE_DBV3";
break;
case AccessDbVersion.Access2000:
command = "CREATE_DBV4";
break;
case AccessDbVersion.Access2003:
command = "CREATE_DB";
break;
}
string attributes = String.Format("{0}=\"{1}\" General\0", command, fileName);
int retCode = SQLConfigDataSource
(0, ODBC_Constants.ODBC_ADD_DSN,
GetOdbcProviderName(), attributes);
if (retCode == 0)
{
int errorCode = 0 ;
int resizeErrorMesg = 0 ;
var sbError = new StringBuilder(512);
SQLInstallerError(1, ref errorCode, sbError, sbError.MaxCapacity, ref resizeErrorMesg);
throw new ApplicationException(string.Format("Cannot create file: {0}. Error: {1}", fileName, sbError));
}
}
64 ビット バージョンの SQL サーバーからこれを行う必要がある場合は、64 ビット バージョンの Office 2010 またはMicrosoft Access データベース エンジン 2010 再頒布可能パッケージがインストールされている必要があります。
SQL Server から行うのはおかしいと思います。SQL Server 用の ODBC DSN を作成し、テーブルを Access 97 MDB にインポートするだけで完了です。それ以外の方法で実行する唯一の理由は、自動化して繰り返し実行したい場合ですが、Access でも自動化でき (TransferDatabase は ODBC インポートを実行できます)、必要なコード行数はその数だけです。インポートするテーブルです。