Попытка выполнить запрос на доступ из приложения c# - PullRequest
0 голосов
/ 09 апреля 2020

Я создал приложение c# windows, которое подключается к базе данных Access.

Мое соединение с базой данных отлично, но есть ли способ выполнить запросы, разработанные в Access, чтобы пользователь мог легко распечатать результаты? Я знаю, что могу создавать отчеты в c#, но просто хочу использовать уже разработанные в Access. Запрос qrySuppliers

// setup connection con to our database    
OleDbConnection con = new OleDbConnection("Provider = 
Microsoft.ACE.OLEDB.12.0; Data Source = Database3.accdb");

// create command object and open it
OleDbCommand cmd = con.CreateCommand();
con.Open();

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Хорошо, мы можем подключиться к ядру базы данных с c#. Хорошо, все хорошо.

Но теперь мы хотим не использовать C#, а фактически использовать доступ к сохраненным запросам. Эти запросы будут ОЧЕНЬ проблематичными c для запуска с C#, потому что часто эти запросы будут использовать функции VBA - вы не можете и не можете вызывать + использовать функции VBA в запросе, который вы создали в C#.

Таким образом, вы даже можете извлечь запрос sql из контейнера доступа, но когда вы пытаетесь запустить их из c#, вам нужно использовать вызовы функций VBA. Теперь значительная часть запросов Access SQL придерживается и использует ТОЛЬКО запросы механизма данных JET / ACE, но все еще довольно распространено, что запросы Access sql, если они разработаны для приложения Access, будут (и могут свободно) использовать функции VBA в эти запросы. Таким образом, это не сработает.

Однако этот рассказ еще хуже, так как вы добавили к этому необходимость и хотите теперь запускать отчеты Access. Ну, на данном этапе вы говорите не о подключении к базе данных, а снова используете объектную модель Access и хотите запускать отчеты Access. Еще раз, отчеты Access, вероятно, одна из самых «убойных» функций Access. Причина, конечно, в том, что отчеты Access также могут использовать VBA в отчете. (при печати, в формате событий для отчета можно использовать и иметь код VBA. В результате, конечно, я даже лучше, чем SQL службы отчетов, код событий (VBA) можно использовать в отчетах для подробных разделов разделов отчетов - за пределами мощных результатов.

Итак, я бы посоветовал вам забыть о соединении с ядром базы данных Access (которое ВСЕ вы получаете, если используете провайдера. net oleDB или. net Провайдеры ODB C. Вы не упоминаете, какого провайдера вы используете для соединения. net, но провайдер oleDB или провайдер ODB C, конечно, не могут запускать и использовать код VBA из * 1041. *.

Конечный результат? Вы должны запустить копию Access как объект, а затем указать этому объекту запустить или распечатать отчет. По сути, вам даже не требуется и не требуется подключение из c#, но нужно только создать экземпляр Access.

например:

{
object accessApp;

accessApp = createObject("Access.Application");

accessApp.OpenCurrentDataBase(@"C:\MDb\Invoices.accDB");

accessApp.Run("TimeUpDate");
accessApp.Quit();
}

Вышеуказанное вызовет + запустить подпрограмму VBA под названием TimeUpdate, которая делает все что угодно.

Вы также можете запустить отчет на принтере по умолчанию с помощью

accessApp.DoCmd.OpenReport ("rptInvoice");

Другими словами, точно так же, как вы можете создать экземпляр слова, или Excel, или в этом случае Access? Вы не подключаетесь к Access, а создаете экземпляр приложения Access и просто выполняете те же команды, которые вы выполняли бы, как если бы вы запустили Access.

Итак, вы, вероятно, можете использовать / запускать некоторые sql запросы. с соединением (поставщики oleDB, ODB C), но если в этих операторах SQL есть VBA, они не будут работать. А для отчетов? Как уже отмечалось, если идти дальше по кроличьей норе, и в этот момент вы можете просто запустить Access здесь и забыть о C#

Имейте в виду, что если вы создадите этот экземпляр Access, и открыть базу данных? Тогда весь код запуска доступа и даже основная форма будут запущены, когда вы сделаете это. Если Access выплевывает какие-либо приглашения или диалоговые окна (или диалоговые формы), то вы не из C# сможете ответить на запросы внутри «accessApp». Таким образом, если код запуска в приложении Access не является относительно чистым, автоматизировать копию Access будет проблематично c.

0 голосов
/ 09 апреля 2020

Я не уверен, что получил то, что вы пытаетесь сделать, но если вы пытаетесь выполнить существующие запросы доступа, вы можете сделать что-то вроде ниже:

OleDbConnection conn = new OleDbConnection(@ "Provider = 
Microsoft.ACE.OLEDB.12.0; Data Source = Database3.accdb");
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "YOUR_QUERY_NAME";

Если ваш запрос ожидает какой-либо параметр, то установите они как ниже ..

cmd.Parameters.AddWithValue("@ParameterName", "YOUR_PARAMETER_VALUE"); 

Спасибо, поскольку это приложение windows, я предполагаю, что вам нужно будет заполнить его в виде данных или что-то в этом роде. Таким образом, вы можете сделать это, как показано ниже:

OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);

И если у вас уже есть gridn и источник данных в вашей форме, вы можете связать его как:

bindingSource1.DataSource = dt;
this.dataGridView1.DataSource = bindingSource1;

Это должно дать некоторое путь к go.

...