powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Подключение к БД Oracle из программы на С#
25 сообщений из 34, страница 1 из 2
Подключение к БД Oracle из программы на С#
    #37737300
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Мой вопрос, наверное, многим покажется глупым, но прошу проявить терпение к новичку. Я начинающий разработчик, опыта пока слишком мало. Очень нужно подключиться из программы на С# к БД Oracle, но нигде не могу найти информации, как это сделать... Может кто-нибудь предложить простой и, главное, полный пример? Подключение, чтение из БД и запись в нее. Спасибо!
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37737905
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tociacla,

Например (чтение сделано на скорую руку, наверняка можно умнее):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
using Oracle.DataAccess.Client;

        /// <summary>
        /// Создаёт объект соединения с БД Oracle
        /// </summary>
        /// <param name="listener">Сервис связи</param>
        /// <param name="login">Логин в БД</param>
        /// <param name="password">Пароль для заданного логина</param>
        /// <param name="host">Сервер БД</param>
        /// <param name="port">Порт сервера для доступа к БД</param>
        public OracleConnection(string listener, string login, string password, string host, string port)
        {
            m_authorizationString = login + "/" + password + "@" + listener;
            //m_connection = new Oracle.DataAccess.Client.OracleConnection("User Id=" + login + ";Password=" + password + "; Data Source=" + listener + ";" );
            m_connection = new Oracle.DataAccess.Client.OracleConnection("Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" +
                "(HOST=" + host + ")(PORT=" + port + ")))" + "(CONNECT_DATA=(SERVER=DEDICATED)(SID=" + listener + ")));" +
                "User Id=" + login + ";Password=" + password + ";");
            //Log.AppLog.LogString("Connecting to DB with credentials " + m_authorizationString);
            try
            {
                m_connection.Open();
            }
            catch (Oracle.DataAccess.Client.OracleException e)
            {
                Log.AppLog.LogString("Connection failed - " + e.Message);
                //Console.WriteLine(e.Message);
            }
        }

        /// <summary>
        /// Выполнить одиночный запрос
        /// </summary>
        /// <param name="query">Строка SQL-запроса</param>
        /// <returns>Признак успешного выполнения</returns>
        public bool PerformQuery(string query)
        {
            try
            {
                if (query.Length > 4000) return false;
                OracleCommand command = m_connection.CreateCommand();
                command.CommandText = query;
                command.ExecuteScalar();
                command.Dispose();
                return true;
            }
            catch (System.Exception ex)
            {
                Log.AppLog.LogString("Error in query: \"" + ex.Message + "\" - with query " + query);
                return false;
            }
        }

        /// <summary>
        /// Чтение данных из таблицы
        /// </summary>
        /// <param name="query">Запрос</param>
        /// <param name="fields">Поля в результате запроса</param>
        /// <returns>Список наборов значений полей</returns>
        public List<string[]> QueryData(string query, params string[] fields) {
            OracleCommand command = m_connection.CreateCommand();
            command.CommandText = query;

            OracleDataReader reader = command.ExecuteReader();
            List<string[]> ret = new List<string[]>();
            while (reader.Read()) {
                string[] read = new string[fields.Length];
                for (int i = 0; i < fields.Length; ++i) read[i] = reader[fields[i]].ToString();
                ret.Add(read);
            }
            return ret;
        }
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37738524
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction, огромное спасибо! Буду разбираться.

А объясните еще пожалуйста: как происходит соединение на физическом уровне? Т.е. а) когда я пишу БД в Oracle, где именно создаются файлы этой БД, как они называются? б) когда происходит соединение, каким именно образом Visual Studio находит эти самые файлы? в) необходимо ли копировать файлы базы данных в папку с программой? г) если в конечном итоге требуется передать программу другому пользователю, то следует ли скопировать файлы БД? при каких условия другой пользователь сможет, запустив программу, успешно работать через эту программу с базой данных? Спасибо!
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37738552
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tociaclaAbstraction, огромное спасибо! Буду разбираться.

А объясните еще пожалуйста: как происходит соединение на физическом уровне? Т.е. а) когда я пишу БД в Oracle, где именно создаются файлы этой БД, как они называются? б) когда происходит соединение, каким именно образом Visual Studio находит эти самые файлы? в) необходимо ли копировать файлы базы данных в папку с программой? г) если в конечном итоге требуется передать программу другому пользователю, то следует ли скопировать файлы БД? при каких условия другой пользователь сможет, запустив программу, успешно работать через эту программу с базой данных? Спасибо!
Ой.
а) Там, куда поставили Oracle. Называются так, как сочтёт нужным Oracle.
б) Когда происходит соединение, Visual Studio категорически не при делах. Более того, написанная клиентская программа тоже категорически не при делах. Есть сервис Oracle, он слушает запросы и сам разбирается, чего с ними дальше делать. То, что Вы этого не понимаете, как минимум странно.
в,г) То, что написано, опирается на сборку Oracle.DataAccess. Для работы достаточно установки соответствующей версии Oracle Client на машину пользователя и наличия (правильной версии!) Oracle.DataAccess.dll в папке с программой. Лично у меня попытки ослабить эти требования до установки у клиента только Instant Client с треском провалились.
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37738564
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AbstractionТо, что Вы этого не понимаете, как минимум странно
Согласен. В глазах профессионалов я выгляжу идиотом. Но оправдываться бессмысленно, т.к. я уже сказал, что новичок.

Abstractionналичия (правильной версии!) Oracle.DataAccess.dll в папке с программой
Что имеется в виду? Какой файл можно считать правильным и где его взять? Извините за дебильные вопросы...
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37738571
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tociaclaЧто имеется в виду? Какой файл можно считать правильным и где его взять? Извините за дебильные вопросы...
ODAC (Oracle Data Access Components) для Вашей версии Oracle. Брать с сайта Oracle.
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37738575
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction,

спасибо за терпение! Буду разбираться
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37747631
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction, добрый день! Пожалуйста, скажите еще: переменной fields нужно самому присвоить значение или, как и listener, login, password, host, port, взять из какого-то оракловского файла?
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37747819
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведь по сути дела fields - это формальный параметр метода QueryData. Я не понимаю, что передавать этому методу при вызове
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37748033
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tociacla,

Нет, из оракловских файлов ничего брать не надо. listener, login, password, host, port - это параметры Вашей БД. fields - названия полей; скажем,
Код: c#
1.
2.
3.
4.
5.
OracleConnection conn = new OracleConnection("testbase", "scott", "tiger", "192.168.1.5", "1521");
List<string[]> names = conn.QueryData("SELECT NAME, DATE FROM MYTABLE WHERE ID>150", "NAME", "DATE");
foreach(string[] record in names){
  Console.WriteLine("Name is " + record[0]);
}
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37749211
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction,
метод QueryData взял у Вас без изменений. Далее вызываю метод при загрузке формы и пытаюсь отобразить результат запроса в dataGridView:

Код: c#
1.
2.
3.
4.
5.
6.
private void Form1_Load(object sender, EventArgs e)
        {
            OracleConnection("XE", ".", ".", ".", ".");
            List<string[]> data = QueryData("SELECT ...", ".", ".", ..., ".");
            dataGridView1.DataSource = data;
        }



В итоге получаю нечто странное:


Можете объяснить, откуда это нечто?
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37749213
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И как сделать так, чтобы отображались столбцы из моей базы данных?
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37749495
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tociacla,

А это DataGridView в действии. Компонент видит, что ему передали набор объектов (List<string[]>). Он берёт объекты (типа string[]), ищет у них публичные свойства, по названиям этих свойств именует столбцы и отображает по объекту в строке. В данном случае каждый объект - это string[] с Length=14 (т.е. в массиве 14 полей), Rank=1 (массив, натурально, одномерный), IsReadOnly=false и т.д.

Как сделать - вопрос интересный. Когда мне надо было отображать данные в dataGridView, я создавал специальный класс, с нужными мне публичными полями и передавал ему список элементов этого класса (заодно и сортировку по столбцам делал). Но, как понимаю, теоретически DataGridView может отображать данные из БД "напрямую". Как? - не знаю, у меня ничего путного (с Oracle, во всяком случае) не получилось. С другой стороны, не особенно и копал.
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37749635
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я, похоже, могу вывести результат запроса в dataGridView при помощи конструктора и адаптера таблиц.... Но считаю, что лучше самому писать код. К тому же мне нужно будет еще и записывать потом в базу данных значения, введенные и dataGridView.
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37749636
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction,

не могли бы Вы привести пример класса, о котором писали? Спасибо!

Модератор: Тема перенесена из форума "Программирование".
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37750128
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tociacla,

Например:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Person{
  public string Name {get; private set;}
  public string Date {get; private set;}
  public string Comment {get; private set;}

  public Person(string name, string date, string comment){Name = name; Date = date; Comment = comment;}
}
//...
OracleConnection conn = new OracleConnection("testbase", "scott", "tiger", "192.168.1.5", "1521");
List<string[]> names = conn.QueryData("SELECT NAME, DATE FROM MYTABLE WHERE ID>150", "NAME", "DATE");
IEnumerable<Person> persons = names.Select(record => new Person(record[0], record[1], "none"));
dataGridViewPeople.DataSource = persons;

В dataGridViewPeople появятся записи со столбцами "Name", "Date" и "Comment".
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37750278
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abstraction,

Пользуясь случаем хочу спросить, вот это http://msdn.microsoft.com/ru-ru/library/system.data.oracleclient.aspx уже совсем устаревшее г-но мамонта и его не стоит использовать даже в простейших случаях или еще на что-то сгодится?
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37750312
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,

Если честно, понятия не имею. Попытка наладить нормальный контакт с БД Oracle сопровождалась достаточно большим количеством гипотез "какого лешего этот вариант не работает", по сию пору не знаю, какие из них были правильными. Поскольку задача была в общем-то второстепенной, то первый рабочий вариант (который передаёт данные и с разумным количеством геморроя переносится на другую машину) меня устроил.
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37752681
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstractiontociacla,

Например:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Person{
  public string Name {get; private set;}
  public string Date {get; private set;}
  public string Comment {get; private set;}

  public Person(string name, string date, string comment){Name = name; Date = date; Comment = comment;}
}
//...
OracleConnection conn = new OracleConnection("testbase", "scott", "tiger", "192.168.1.5", "1521");
List<string[]> names = conn.QueryData("SELECT NAME, DATE FROM MYTABLE WHERE ID>150", "NAME", "DATE");
IEnumerable<Person> persons = names.Select(record => new Person(record[0], record[1], "none"));
dataGridViewPeople.DataSource = persons;

В dataGridViewPeople появятся записи со столбцами "Name", "Date" и "Comment".

Abstraction, не появилось...
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37754397
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abstraction,

Все работает. Спасибо!
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37755123
pyroman69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #37773095
tociacla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pyroman69,

Спасибо!
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #38049551
наш человек в гаване
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могли бы вы ответить на несколько вопросов:

1. Насколько целесообразно использовать
Код: c#
1.
2.
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;


вместо
Код: c#
1.
using Oracle.DataAccess.Client;



2. Можно ли отдельно скачать одну библиотеку Oracle.DataAccess.Client?;

3. Я скачал с сайта Oracle ODAC112012.
Я не вижу в составе дистрибутива Oracle.DataAccess.dll

спасибо!
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #38049722
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наш человек в гаванеМогли бы вы ответить на несколько вопросов:

1. Насколько целесообразно использовать
Код: c#
1.
2.
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;


вместо
Код: c#
1.
using Oracle.DataAccess.Client;


Если Вы про вот это Oracle Data Provider for .NET, Managed Driver Beta 11.2.0.3.50 , то по состоянию на сейчас разве что для ознакомительных и тестовых целей: beta - и этим все сказано... А у Oracle даже релизы содержат много мелких, но достаточно некомфортных багов...
наш человек в гаване2. Можно ли отдельно скачать одну библиотеку Oracle.DataAccess.Client?;
А смысл? Без инстант клиента все равно не будет работать...

Если просто не хочется качать и устанавливать "полного клиента", всегда можно скачать "xcopy-deployment" комплект - его можно разворачивать вместе с приложением.
наш человек в гаване3. Я скачал с сайта Oracle ODAC112012.
Я не вижу в составе дистрибутива Oracle.DataAccess.dll
спасибо!Во-первых, чего такую "древнюю" версию используете?
"На сейчас" актуальна версия ODAC1120320 - на релиза на 3 "по-свежее" будет...

Во-вторых, если Вам нужна (по каким-то причинам) конкретно эта dll-ка, скачайте "xcopy-deployment" - в полученом архиве есть подкаталоги odp.net20 и odp.net4 - там есть...
...
Рейтинг: 0 / 0
Подключение к БД Oracle из программы на С#
    #38050536
наш человек в гаване
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mv , спасибо за развёрнутый ответ!

Скачал и установил клиента с ODP.NET
Создаю в C# windows forms приложение для работы с БД Oracle.
Подключил Oracle DataAccess в References.

На форме создал кнопку и метку. Идея проста: нажать на кнопку и по событию нажатия
на кнопку вывести результат в метку.

Вот код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider
using Oracle.DataAccess.Types; 

namespace oraspec1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string oradb = "Data Source=BI_TEST;User Id=scott;Password=tiger;";
            OracleConnection conn = new OracleConnection(oradb);  // C#
            conn.Open();
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            cmd.CommandText = "select id, code, name from c_objects c where c.id =658570587;";
            cmd.CommandType = CommandType.Text;
            OracleDataReader dr = cmd.ExecuteReader();
            dr.Read();
            label1.Text = dr.GetString(0);
            conn.Dispose();
        }
    }
}




В результате запуска получаю ошибку Oracle.DataAccess.Client.OracleException ORA-00911: неверный символ:


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
Oracle.DataAccess.Client.OracleException ORA-00911: неверный символ    at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, 
IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
   at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, 
String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck)
   at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, 
Boolean fillRequest, CommandBehavior behavior)
   at Oracle.DataAccess.Client.OracleCommand.ExecuteReader()
   at oraspec1.Form1.button1_Click(Object sender, EventArgs e) in C:\C#\Projects\oraspec1\oraspec1\Form1.cs:line 30
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)



подскажите, как нужно правильно написать?
спасибо!
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Подключение к БД Oracle из программы на С#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]