我有一个access数据库,我需要运行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#与DB.Anything通信将会有所帮助,谢谢。
我主要使用的代码如下:
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();
}
}
}发布于 2019-03-09 10:16:08
不幸的是,使用.net时,您不能在两个不同的连接之间执行追加或make table查询。
但是,您可以在Access中。
如果您有一个返回记录的工作SQL查询,那么您可以简单地将该查询保存在Access中(作为传递查询。
现在,您可以在Access中使用该查询,并将其发送到Access中的新本地表。(Access支持此概念,而.net不支持)
因此,您可以对该数据进行追加或“制表”。
更有趣的是,您甚至可以在Access中的不同连接之间进行附加。因此,您可以从一个Oracle表追加到access中MySQL、PostgreSQL或FoxPro表。
同样,您不能在.net中做到这一点。
那么,假设一个在PostgreSQL中工作的原始SQL (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以包括该选择的条件。
(air代码-不考虑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 = Edmonton的所有记录复制到Access表中(在本例中称为本地表)。
如上所述,您不限于“LocalTable”是一个access表,它可以是一个FoxPro表、MySQL、SQL server等。因此,可以使用Access中的任何链接表-包括指向其他数据库系统的链接表。
如果您必须使用.net,那么您必须:
连接到第一个数据库。执行查询以拉取和填充数据表。
连接到第二个数据库。创建(打开)基于第二个数据库的数据表。
循环(迭代)第一个连接datatable中的每一行,并将该行复制到第二个datatable中(基于第二个连接)。
你必须逐行复制。(但是.net数据表有ImportRow方法,所以您不必逐列复制循环。(但您必须逐行循环)。
在Access中,此循环不是必需的,事实上,您可以使用SQL命令在两个表上操作,包括上面的make table和append,您甚至可以在这类表之间进行关系连接-甚至是基于不同连接(数据源)的表。
编辑
根据评论,看起来简单的问题是:
在Access中插入一行后,如何获取该插入的最后一个ID (标识)?
下面的vb.net代码将执行此操作: Imports 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)Output =最后一个主键id (自动编号)
https://stackoverflow.com/questions/55068979
复制相似问题