Написание SQL OleDbCommand для импорта данных из SqlServer в базу данных Access

У меня есть следующий код:

ADOX.Catalog cat = new ADOX.Catalog();
string pathToNewAccessDatabase = "Data Source=D:\\Data\\NewMDB.mdb";

cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" + pathToNewAccessDatabase + ";Jet OLEDB:Engine Type=5");

System.Data.OleDb.OleDbConnection AccessConn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + pathToNewAccessDatabase);

AccessConn.Open();
System.Data.OleDb.OleDbCommand AccessCommand = new System.Data.OleDb.OleDbCommand("SELECT * INTO [ReportFile] FROM [Data Source=server_path; Initial Catalog=database_name; User Id=user_name; Password=pass_word;Trusted_Connection=False].[dbo.DataSourceTable]", AccessConn);

AccessCommand.ExecuteNonQuery();
AccessConn.Close();

Я хочу выбрать из SQL SERVER в базу данных ACCESS.

Кроме того, если пароль содержит символ [, как его избежать?


person Dragos Durlut    schedule 18.01.2012    source источник
comment
Я вполне могу ссылаться либо на встроенную базу данных SQL Server, либо на базу данных Access и обновлять ее с помощью одного оператора sql: stackoverflow.com/questions/3473380/   -  person Fionnuala    schedule 19.01.2012
comment
@Remou Да, вы правы, но я должен внести изменения в SqlServer, чтобы это работало. Я немного боюсь, что могу что-то напутать. (как производительность)   -  person Dragos Durlut    schedule 23.01.2012


Ответы (1)


Я предлагаю сначала установить SQLConnection с сервером SQL и запросить нужные данные в DataTable.

using (SqlConnection conn = new SqlConnection("yourConnectionString"))
{
    using (SqlCommand comm = new SqlCommand("Select columns from targetTable", conn))
    {                    
        SqlDataReader reader = comm.ExecuteReader();
        DataTable tbl = new DataTable();
        tbl.Load(reader);
    }
}

После того, как у вас есть данные в вашем datatatable, создайте из него запрос для вашей команды вставки, прокручивая данные.

string insertCommandString = string.Empty;

for (int row = 0; row < tbl.Rows.Count; row++)
{
    insertCommandString = "Insert into yourTableName(yourColumnNames) values(";
    for (int column = 0; column < tbl.Columns.Count; column++)
    {
        if(tbl.Columns[column].DataType == typeof(String))
        {
            insertCommandString += "'" + tbl.Rows[row][column].ToString() + "'";
        }
        else
        {
            insertCommandString += tbl.Rows[row][column].ToString();
        }

        if (column < tbl.Columns.Count - 1)
        {
            insertCommandString += ",";
        }
   }

   insertCommandString += ")";

   System.Data.OleDb.OleDbCommand AccessCommand = new System.Data.OleDb.OleDbCommand(insertCommandString, AccessConn);
   AccessCommand.ExecuteNonQuery();
 }

Вы не должны экранировать ни один символ из пароля.

person SLOBY    schedule 18.01.2012