Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > ADO.net


Автор: Finkel 10.5.2004, 22:49
хотелось бы знатьа можно вносить изменения в Бд с помощью технологии OLE DB.
я просто сейчас читаю книгу по си шарпу , но в ней говорится больше о технологиях провайдера SQL

Автор: stron 10.5.2004, 23:24
Конечно можно.
Просто The Microsoft SQL Server .NET data provider рекомендуем для работы с MsSQL server 7.0+
(по идеи он должен быстрее работать, т.к. меньше ступеней при в/д)

The Microsoft OLE DB .NET data provider рекомендуем для работы с MsSQL server до версии 6.5 (интересно, а им ещё кто-то пользуется???), Access'ом...........
Просто OLE DB - более универсальная штука, но многие провайдеры придётся скачивать из инета



Автор: Kurt 11.5.2004, 00:18
OLE DB работает медленнее, чем специализированные сборки, такие как для MSSQL. Однако OLEDB более универсальна.
Вобщем, на всякий пожарный, вот тебе пример работы через OLEDB.
Тока поменяй цикл, к-й вносит данные в БД, под скорость твоего компа.
Здесь я реализовал все основные операции (создание таблицы, insert, select, удаление..).
Вот:

Код


using System;
using System.Data;
using System.Data.OleDb;

class MainClass
{
public static void Main(string[] args)
{
 OleDbConnection dbConnection = new OleDbConnection();
 dbConnection.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;"+@"data source=G:\baza.mdb";
 dbConnection.Open();
 try{
  Console.WriteLine("Creating table..");
  OleDbCommand mycmd = new OleDbCommand("create table TableFromDotNET (c1 integer, c2 varchar(100))",dbConnection);
  mycmd.ExecuteNonQuery();
  Console.WriteLine("Done.");
 
  Console.WriteLine("Inserting into table..");
  for (int i=1; i<=100000; i++){
   mycmd.CommandText = @"insert into TableFromDotNET values ("+i+",'Yes!!')";
   mycmd.ExecuteNonQuery();
   if (i%1000==0){
    Console.WriteLine(i/1000+"% completed.");
   }
  }
  Console.WriteLine("Done.");
 
  Console.WriteLine("Selecting from table..");
  mycmd.CommandText = "select * from TableFromDotNET";
  OleDbDataReader myDataReader = mycmd.ExecuteReader();
  while (myDataReader.Read()){
   Console.WriteLine("c1="+myDataReader["c1"].ToString()+"   c2="+myDataReader["c2"].ToString());
  }
  myDataReader.Close();
  Console.WriteLine("Done.");
 
  Console.WriteLine("Deleting from table..");
  mycmd.CommandText = "delete from TableFromDotNET";
  mycmd.ExecuteNonQuery();
  Console.WriteLine("Done.");
 
  Console.WriteLine("Deleting table..");
  mycmd.CommandText = "drop table TableFromDotNET";
  mycmd.ExecuteNonQuery();
  Console.WriteLine("Done.");
 
 
 }
 catch (Exception ex){
  Console.WriteLine("Error:"+ex.Message);
 }
 
 dbConnection.Close();
 
 Console.Read();
 return;
}
}


Может, немного коряво, но я думаю понятно.
Если что - спрашивай..

Автор: Finkel 11.5.2004, 23:16
Цитата
Код
Console.WriteLine("Deleting from table..");
 mycmd.CommandText = "delete from TableFromDotNET";
 mycmd.ExecuteNonQuery();
 Console.WriteLine("Done.");


[

разве есть такая команда в SQL ?
в принцепе все практически ясно , правда половины вещей я не нашел в своей книжке sad.gif.

Можно ли работать обьектом DataSet, а потом записывать этот обьект в бд?

Автор: stron 12.5.2004, 00:49
Цитата

разве есть такая команда в SQL ?

есть!!
Код

delete from TableFromDotNET

удаляет все строки из таблицы.

Автор: Kurt 12.5.2004, 19:26
Цитата
в принцепе все практически ясно , правда половины вещей я не нашел в своей книжке .

Если что - спрашивай.. Если сможем - попробуем ответить..
Цитата
Можно ли работать обьектом DataSet, а потом записывать этот обьект в бд?

Не мог бы ты уточнить/перефразировать вопрос?
Тебе нужно решение именно через DataSet?
Я не уверен, что правильно тебя понял..

Автор: Kurt 12.5.2004, 20:53
Цитата
Можно ли работать обьектом DataSet, а потом записывать этот обьект в бд?

Аааа.. Понял. Что-то я сразу не сообразил. smile.gif
Посмотри в сторону DataAdapter. Он есть как в OLEDB (OleDbDataAdapter), так и в SQL-сборке (SqlDataAdapter).
В нем есть такие интересные методы как Fill() - заполнение DataSet из базы, а также Update() - обновление БД из DataSet.
Fill() многократно перегружен, можно выбирать нужный "диапозон" записей для загрузки и т.п.
Update() имеет параметры:
- DataSet
- string <Имя таблицы> - какую таблицу обновить..

Перед тем, как исполнять, данный метод тебе нужно определить как минимум Insert операцию.
В примере, прикрепленном ниже, я показал, как это делается - тебе нужно определить входные параметры, имена столбцов, их типы и т.п.
Еще в коде я использовал метод PrintTable - это просто вспомогательный метод, чтоб выводить таблицу.
Для нормальной работы тебе нужна будет база - файл baza.mdb в той же директории, что и .exe, а также таблица myTable с двумя столбцами:
intColumn (целочисл. столбец)
strColumn (строка..).
Что делает пример - открывает базу, записывает в DataSet таблицу из БД, выводит на консоль, добавляет три строки в DataSet, обновляет БД и выводит, что получилось.
Вот код:

Код

using System;
using System.Data;
using System.Data.OleDb;

class MainClass
{
//вспомогательный метод - печатает таблицу..
private static void PrintTable(DataSet ds, string tableName)
{
 Console.WriteLine(tableName+":");
 DataTable tbl = ds.Tables[tableName];
//выводим заголки столбцов
 for(int currentColumn=0; currentColumn<tbl.Columns.Count; currentColumn++)
 {
  Console.Write(tbl.Columns[currentColumn].ColumnName.Trim()+"\t");
 }
 Console.WriteLine();
//собственно данные
 for(int currentRow=0; currentRow<tbl.Rows.Count; currentRow++)
 {
  for(int currentColumn=0; currentColumn<tbl.Columns.Count; currentColumn++)
  {
   Console.Write(tbl.Rows[currentRow][currentColumn].ToString().Trim()+"\t");
  }
  Console.WriteLine();
 }
 
 return;
}

public static void Main(string[] args)
{
 Console.WriteLine("Connecting to database.");
//создаем соединение
 OleDbConnection cn = new OleDbConnection();
 cn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;"+@"data source=baza.mdb";
//открываем его
 cn.Open();
 string sqlSelect = "select * from myTable";
//определяем DataAdapter, а также Insert-операцию
 OleDbDataAdapter dAdapter = new OleDbDataAdapter(sqlSelect, cn);
 dAdapter.InsertCommand = new OleDbCommand("insert into myTable (intColumn, strColumn) values (@intColumn,@strColumn)",cn);
 OleDbParameter param;
 
 param = dAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@intColumn",OleDbType.Integer));
 param.SourceColumn = "intColumn";
 param.SourceVersion = DataRowVersion.Current;

 param = dAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@strColumn",OleDbType.VarChar));
 param.SourceColumn = "strColumn";
 param.SourceVersion = DataRowVersion.Current;

//наш DataSet
 DataSet ds = new DataSet("myDataSet");
 try
 {
//заполняем DataSet
  dAdapter.Fill(ds, "myTable");
 }
 catch(Exception ex)
 {
  Console.WriteLine(ex.Message);
 }
 Console.WriteLine("Before..");
 PrintTable(ds,"myTable");
//выводим нашу таблицу
 DataRow myRow;
//добавляем строки в DataSet
 for (int i=0; i<3; i++)
 {
  myRow = ds.Tables["myTable"].NewRow();
  myRow["intColumn"] = i;
  myRow["strColumn"] = "It works!";
  ds.Tables["myTable"].Rows.Add(myRow);
 }
 try
 {
//обновляем БД и выводим итог
  dAdapter.Update(ds,"myTable");
  ds.Dispose();
  ds = new DataSet();
  dAdapter.Fill(ds,"myTable");
  PrintTable(ds,"myTable");
 }
 catch(Exception ex)
 {
  Console.WriteLine(ex.Message);
 }
 finally
 {
//закрываем соединение..
  cn.Close();
 }

 
 Console.Read();
 Console.Read();
}
}


Все. Надеюсь, этот код чем-то помог.
Удачи!

З.Ы. Пример готов к компиляции. Можно откомпилить и запустить..

Автор: Finkel 12.5.2004, 23:33
фух , минут тридцать сравнивал обьявления параметров smile.gif.. я думал сначала их нада обозвать , а оказывается нет ..

Автор: Kurt 12.5.2004, 23:44
Немножко не понял, что ты имеешь ввиду..
Извини, что запутал - я наоборот старался, чтоб поаккуратнее, да попроще..

Автор: Finkel 13.5.2004, 22:19
хм, а как можно сделать :
на одной форме критерии и поиск таблицы , а результат передать в другую форму в DataGrid ?

Автор: Kurt 13.5.2004, 22:45
Модератор: Давайте вернёмся к теме обсуждения.

Если хочешь задать другой вопрос, настоятельно рекомендую создать НОВУЮ тему с соответствующим названием.
Таким образом, ты привлечешь внимание тех, кто знает ответ.
А также это соответствует правилам форума.
1 топик - 1 вопрос. wink.gif

Автор: Finkel 18.5.2004, 10:35
Вот пробывал добавить в свою базу строку
Код

OleDbConnection cn =new OleDbConnection();
  cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"+@"Data source = D:\db1.mdb";
  cn.Open();
  string sqlSelect="select * from prihodniy_order";
  OleDbDataAdapter MyAdapter = new OleDbDataAdapter(sqlSelect,cn);
           MyAdapter.InsertCommand=new OleDbCommand("insert into Rashodniy_order(Order_id,Schet,Prinyato,Summa,Osnovanie,Month,Day) values (@Order_id,@Schet,@Prinyato,@Summa,@Osnovanie,@Month,@Day)");
 
  OleDbParameter param;
  param = MyAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@Order_id",OleDbType.Integer));
  param.SourceColumn="Order_id";
  param.SourceVersion=DataRowVersion.Current;
 
 
  param = MyAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@Schet",OleDbType.Integer));
  param.SourceColumn="Schet";
  param.SourceVersion=DataRowVersion.Current;
 
  param = MyAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@Prinyato",OleDbType.VarChar));
  param.SourceColumn="Prinyato";
  param.SourceVersion=DataRowVersion.Current;
 
  param = MyAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@Summa",OleDbType.Double));
  param.SourceColumn="Summa";
  param.SourceVersion=DataRowVersion.Current;
 
 
  param = MyAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@Osnovanie",OleDbType.VarChar));
  param.SourceColumn="Osnovanie";
  param.SourceVersion=DataRowVersion.Current;
 
  param = MyAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@Month",OleDbType.Integer));
  param.SourceColumn="Month";
  param.SourceVersion=DataRowVersion.Current;
 
  param = MyAdapter.InsertCommand.Parameters.Add(new OleDbParameter("@Day",OleDbType.Integer));
  param.SourceColumn="Day";
  param.SourceVersion=DataRowVersion.Current;
 
  if((int.Parse(textBox5.Text)<0) & (int.Parse(textBox5.Text)>31)) { MessageBox.Show("Uncorrect Date");
         textBox5.Text="";
         textBox6.Text="";
        }

  if((int.Parse(textBox6.Text)<0) & (int.Parse(textBox6.Text)>12))
  {
    MessageBox.Show("Uncorrect Date");
   textBox5.Text="";
   textBox6.Text="";
  }
  DataSet Ds= new DataSet("Prihodniy_order");
  MyAdapter.Fill(Ds,"Prihodniy_order");
  DataRow Myrow;
  Myrow= Ds.Tables["Prihodniy_order"].NewRow();
  Myrow["Order_id"]=int.Parse(textBox1.Text);
  Myrow["Schet"]=int.Parse(textBox2.Text);
  Myrow["Prinyato"]=textBox3.Text;
  double Dbl = double.Parse(textBox7.Text);
  Myrow["Summa"]=Dbl;
  Myrow["Osnovanie"]=textBox4.Text;
  Myrow["Month"]=int.Parse(textBox6.Text);
           Myrow["Day"]=int.Parse(textBox5.Text);
  Ds.Tables["Prihodniy_order"].Rows.Add(Myrow);
  try
  {
   MyAdapter.Update(Ds, "Prihodniy_order");
  }
  catch( Exception Ex)
  {
   MessageBox.Show("Exeption"+Ex);
  }
  Ds.Dispose();
  Close();
 }



возникает прирывание , в котором говорится что не инициализирована Инсерт-операция .
В чем яне прав , все сделал по примеру Курта.

Автор: Kurt 18.5.2004, 16:05
Цитата
В чем яне прав , все сделал по примеру Курта.

Хмммм.. Да. Действительно похоже.. Однако, говоришь, не работает..
Смотрим.. Стоп!
..А ЭТО что?!
Сравним две строчки кода.

Твой код:
Цитата
MyAdapter.InsertCommand=new OleDbCommand("insert into Rashodniy_order(Order_id,Schet,Prinyato,Summa,Osnovanie,Month,Day) values (@Order_id,@Schet,@Prinyato,@Summa,@Osnovanie,@Month,@Day)");


Мой пример:
Цитата
dAdapter.InsertCommand = new OleDbCommand("insert into myTable (intColumn, strColumn) values (@intColumn,@strColumn)",cn);


Чувствуешь разницу? У тебя нету второго параметра в конструкторе! Очевидно, просто конструктор перегружен - считается, что ты определишь этот параметр позже или из еще каких-то соображений. Попробуй указать вторым параметров твой OleDbConnection cn; Как у меня в примере.
Поидее, всю будет работать..
Опробуй и доложи о результатах - если нет, дальше будем искать..
Удачи! smile.gif

З.Ы. Попутно.. Не подумай ничего такого, но вроде вместо "Uncorrect" надо писать "Incorrect".. А, можь, и нет..

Автор: Finkel 18.5.2004, 21:49
Возникает ексепшн с вот таким текстом
"ExceptionSystem.Data.OleDb.OleDb.Exception ошибка ситаксиса инструкции INSERT INTO,
at System.Data.comon.DbDataAdapter.Update(DataRow[] dataRow,DataTableMapping tableMapping )
at System.Data.comon.DbDataAdapter.Update(DataSet dataset,String srcTable)
at ..."

єто опять с Инсертом как то связано?

Автор: Finkel 19.5.2004, 22:45
может я ошибся изменив регистр букв ? Важно ли это для SQL Запроса?

Автор: Kurt 20.5.2004, 00:52
Нет, насколько я знаю, в C#.NET это не важно.
Если я найду в чем проблема - непременно скину..

З.Ы. Накрайняк, отошлешь мне весь проект..
Ессно, если ты МОЖЕШЬ/ХОЧЕШЬ это делать.
Может, у тебя коммерческий проект.

Автор: Finkel 20.5.2004, 13:16
может я не правильно использовал типы данных ?
так если в Access`e я использую целое число то параметр должен быть OleDbType.Integer?
двойное с плавающей точкой это OleDbType.Double
строка это OleDbType.VarChar ?

Автор: Finkel 20.5.2004, 22:38
Курт , спасибо за помощь ... я сделал через
OleDbCommand и все заработало ... а вот через определение инсерт операции не полчается до сих пор .

З.Ы. но уже все работает smile.gif!

Автор: Kurt 20.5.2004, 23:02
Искренне рад за тебя. smile.gif
Вот только почему через Insert не работало..
Можь, у тебя там еще где ошибки были? Я ж весь код не видел..
Удачи!

Автор: Finkel 21.5.2004, 01:59
у меня все таки большие подозрения ,что я не правильно определил тип парметров , которые передавались бы в таблицу .

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)