Есть ли версия PostgreSQL, возвращаемая в Access DB? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть база данных доступа, для которой мне нужно выполнить запрос, который доступен в БД postgres. Мне было интересно, возможно ли это сделать:

Insert into Table (Col1,Col2...) values(Val1,Val2,...) returning * (ore even just an id defining that specific set of data that was just inserted)? 

Я использую c # для связи с БД. Всё бы помогло, спасибо.

Код, который я в основном использую, следующий:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.OleDb;

namespace Testquery1
{
    class Program
    {

        static void Main(string[] args)
        {

            string query = "INSERT INTO Table ( Val1, Val2, Val3 ) values(14,2,1)";
            Test1 queryselect = new Test1();
            queryselect.dataconnection(query);
        }


    }
    class Test1
    {

        public OleDbConnection connection = new OleDbConnection();
        string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        string fileloc = @"DataBase.accdb";
        string provider = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=";
        public void dataconnection(string query)
        {

            connection.ConnectionString = provider + path + fileloc;
            Console.WriteLine(connection.ConnectionString);
            connection.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            command.CommandText = query;
            command.ExecuteNonQuery();
            connection.Close();
        }
    }
}

1 Ответ

0 голосов
/ 09 марта 2019

К сожалению, с .net вы не можете добавлять или делать запросы к таблицам между двумя разными соединениями.

Однако вы МОЖЕТЕ получить доступ.

Если у вас есть рабочий SQL-запрос PostgreSQL, который возвращает записи, вы можете просто сохранить этот запрос в Access (как сквозной запрос.

Теперь вы можете использовать этот запрос в Access и отправить его в новую локальную таблицу в Access. (Access поддерживает эту концепцию, .net - нет)

Таким образом, вы можете либо добавить, либо «составить таблицу» этих данных.

И что еще интереснее, вы можете даже добавлять различные соединения в Access. Таким образом, вы можете добавить из таблицы PostgreSQL слова MySQL или Oracle или FoxPro внутри доступа.

Опять же, вы не можете сделать это в .net.

Итак, предположим, что работающий необработанный запрос SQL (в формате PostgreSQL) работает в PostgreSQL? Возьмите тот же самый рабочий запрос и сохраните его в Access как сквозной запрос.

Затем в Access вы можете добавить таблицу в Access (при условии, что структура таблицы будет такой же:

VBA (код доступа)

Dim strSQL as string
strSQL = "INSERT INTO LocalTable SELECT * from QryPassR"
Currentdb.Execute strSQL

И если вы хотите СДЕЛАТЬ новую таблицу в Access с такой же структурой, поэтому создайте таблицу (не добавляйте), вы можете перейти:

Dim strSQL as string
strSQL = " SELECT * INTO LocalTable FROM qryPassR"
Currentdb.Execute strSQL

Вы также можете в коде VBA изменить PostgreSQL, чтобы включить критерии для этого выбора.

(воздушный код - не учитывает проблему внедрения SQL).

Dim strCity as string.

strCity = inputbox("What city to pull from PostGres?")

dim strSQL as string

strSQL = "select * from tbleHotels where City = '" = strCity & "'"

With currentdb.QueryDefs("QryPassR"
  .SQL = strSQL
End with
strSQL = "INSERT INTO LocalTable SELECT * from QryPassR"
Currentdb.Execute strSQL

‘выше скопирует все записи из PostGreSQL города = Эдмонтона в таблицу Access (в данном примере называемую локальной таблицей).

И, как уже было отмечено, вы не ограничены «LocalTable» таблицей доступа, это может быть таблица FoxPro, MySQL, SQL-сервер и т. Д. Таким образом, вы не ограничены JUST использованием таблиц Access, указанных выше, с вашим данным SQL. Таким образом, можно использовать любую связанную таблицу в Access, включая таблицы, которые указывают на другие системы баз данных.

Если вы должны использовать .net, тогда вы должны:

Подключиться к первой базе данных. Выполните запрос, чтобы получить и заполнить таблицу данных.

Подключиться ко второй базе данных. Создать (открыть) таблицу данных на основе второй базы данных.

Зацикливание (повторение) каждой строки из первого соединения с данными и копирование строки во второй объект данных (на основе 2-го соединения).

Вы должны делать построчное копирование. (но есть метод ImportRow для данных .net, так что вам не нужно циклически копировать столбец за столбцом. (но вы должны цикл за строкой).

В Access это зацикливание не требуется, и фактически вы можете использовать команды SQL, которые работают с обеими таблицами, в том числе в соответствии с приведенными выше таблицами make и append, и вы даже можете выполнять соединения отношений между такими таблицами - даже те, которые основаны на разных соединения (источники данных).

Редактировать

Судя по комментариям, выглядит простой вопрос:

После того, как я вставил строку в Access, как я могу получить последний идентификатор (идентификатор) этой вставки?

Следующий код vb.net сделает это: Импортирует System.Data.OleDb

Dim MyCon As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test2\test44.accdb")
MyCon.Open()
Dim strSQL As String = "insert into tblHotels2 (City) VAlues('Edmonton')"
Dim cmd As New OleDb.OleDbCommand(strSQL, MyCon)
Dim r As Integer
cmd.ExecuteNonQuery()
cmd.CommandText = "select @@IDENTITY"
r = cmd.ExecuteScalar
Debug.Print(r)

Выходные данные = последний идентификатор ПК (автономный номер)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...