我需要将数据从SQL Server 2005 DB导出到Access 97 .mdb文件。需要它的客户端需要它是Access 97,因为他们导入它的系统需要Access 97文件格式(不要让我开始)。有关如何从SQL或.Net(或VB6或Ruby或Python ..)编写旧的Access文件的任何建议吗?
提前致谢, 利
答案 0 :(得分:4)
我让Sql 2005为你做。
在Sql Management Stuidio中,右键单击源数据库,然后右键单击“任务”,再单击“导出数据”。您可以使用它直接导出到Access数据库,只需按照提示操作即可。或者您可以将其输出为可用于放入Access的文件格式。
答案 1 :(得分:2)
您需要做的是导入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函数。当然,无论如何你都不需要转换文件。
答案 2 :(得分:0)
This可能会给你一个起点。 并且this article有点旧,但你可能能够拿起一些东西。我只能找到使用Jet 4.0的那些,与之前的文章中的Access 2000兼容。使用MS Access驱动程序可能会为您提供所需的内容。
创建数据库后,在ADO.NET中使用常规的ODBC / OLE DB相关内容来创建表,并使用您的数据填充它们。
答案 3 :(得分:0)
我认为从SQL Server做到这一点很疯狂。只需为SQL Server创建一个ODBC DSN,然后将表导入Access 97 MDB并完成它。您可能想要这样做的唯一原因是,如果您想要自动执行它并重复执行它,但也可以在Access中自动执行(TransferDatabase可以执行ODBC导入),并且只需要那么多行代码是要导入的表。
答案 4 :(得分:0)
这是一个很好的问题!我实际上希望能够以程序化的方式做这种事情,但在过去,我只是遇到了麻烦。但是,多年来我的.NET技能已经成熟了一些,我想我会尝试编写一个可以作为Console应用程序执行的解决方案。这可以作为Windows服务器或sql server上的计划任务(使用Sql Server代理)实现。我不明白为什么在没有以下代码的情况下无法从Sql Server自动化,但我真的很开心,所以我只需要把它放在那里。 Sql和Access中的表是一个狗列表,带有ID,名称,品种和颜色。通用的东西。这实际上可以在我的桌面上在Sql Server的本地实例和Access之间工作(2007,但我不知道为什么它不适用于97)。请随意批评。
BTW,有以下几点: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();
}
答案 5 :(得分:0)
执行此操作的最佳方式是PInvoke您需要将CREATE_DBV3
参数传递给SqlConfigDataSource()。以下是我的OSS项目JetSqlUtil.cs的PlaneDisaster.NET代码:
#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 Server执行此操作,则需要安装64位版本的Office 2010或Microsoft Access Database Engine 2010 Redistributable。