vb net, RichTextBox, Oracle

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

vb net, RichTextBox, Oracle

Сообщение Anta » 26.09.2012 (Ср) 3:20

Здравствуйте, стоит задача загрузить конкретное поле строки из таблицы БД Оракл в текстовый контрол, пробую это сделать в RichTextBox, но получаю ошибку, если значение в таблице в этом поле пустое (а пустые значения могут быть). Как можно сделать проверку на пустое значение и подставку вместу пустого значения,допустим, слова "NA". Знаю, что нужно проверять на DbNull...Возможно кто-то сталкивался и есть какой-либо пример. наводящий на мысль?
Или есть предложения по использованию другого контрола для загрузки текста?
Спасибо.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: vb net, RichTextBox, Oracle

Сообщение HandKot » 26.09.2012 (Ср) 7:00

как вариант, можно учесть все это прямо в запросе
Код: Выделить всё
select IsNull(MyField, 'NA') From ...
I Have Nine Lives You Have One Only
THINK!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.09.2012 (Ср) 7:43

Anta писал(а):Знаю, что нужно проверять на DbNull...

Ну и в чём собственно проблема? If Obj = DbNull Then
Кстати, если речь идёт о строке, то можно использовать TryCast.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: vb net, RichTextBox, Oracle

Сообщение ark » 26.09.2012 (Ср) 11:32

Код: Выделить всё
Public Shared Function GetDBString(ByVal o As Object, Optional ByVal strDBNull As String = "") As String
    If o Is Nothing Then Return strDBNull
    If IsDBNull(o) Then Return strDBNull Else Return o.ToString
End Function

MsgBox(DBHelper.GetDbString(SomeDataRow("TextField"),"Не указано"))

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.09.2012 (Ср) 20:29

ark писал(а):If o Is Nothing

Нет. Проверка на Nothing даст False. Надо сравнивать с DbNull.

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 27.09.2012 (Чт) 5:15

Спасибо, все работает.
А можно ли сделать так: загрузить таблицу в dataGridView и загружать данные из одно конкретной ячейки dataGridView в RichtextBox для редактирования или введения новых данных ( ячейка содержит текст -комментарий) и затем возвратить измения в таблицу БД? как осуществлять связь RichtextBox c БД? На данный момент я загружаю таблицу в dataGridView, выделяю строку, по нажатию на клавишу выбираю значение из таблицы БД (комментарий) в RichtextBox
(select comment from table1 where param= datagridview.currentrow.cell(1).value), затем редактирую полученное выражение в RichtextBox и хочу вернуть его в таблицу БД:
update table1 set comment =richetext.box.text where id= datagridview.currentrow.cell(0).value. То есть ссылаюсь на значение ключа выбранной строки, но получаю ошибку: нельзя пребразовать double в string....-значение ключа...Подскажите, как поступить, возможно есть другие подходы?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.09.2012 (Чт) 7:46

Я тебе уже говорил как надо передавать параметры.

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 27.09.2012 (Чт) 14:47

не подумала,что значение ячейки можно тоже передать как параметр, спасибо за напоминание, работаю с 3мя разными проектами, голова кипит...

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: vb net, RichTextBox, Oracle

Сообщение ark » 28.09.2012 (Пт) 11:06

Qwertiy писал(а):Проверка на Nothing даст False. Надо сравнивать с DbNull
Так я и сравниваю - потом. У меня в эту функцию и Nothing может пердаваться. Для всех неинициализированных строк (хоть с базы, хоть откуда) - lbl.Text=Helper.GetDBString(my_string,"Не указано")

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 29.09.2012 (Сб) 5:07

нужнен совет, я запуталась, стоит задача:
исходные данные: table1 из Oracle
на форме: DatagridView, 3 radiobutton, 5 checkbox,datatimepicker
необходимо выводить данные из table1 на основе выбранных radiobutton и checkbox,datatimepicker в один и тот же DatagridView (получается 9 запросов к одной и той же таблице, выполняемых по выбору пользователя по нажатию на кнопку) и редактировать данные. Пользователь выбирает критерии: только номер заказа или номер заказа и дату заказа, или все заказы с определенной датой и тп,нажимает на кнопку и получает результа в DatagridView. Пользователь может изменить данные, такие как: проставить галочку- да, заказ выполнен или да, заказ проплачен, проставить дату заказа и потом, нажав на кнопку, вернуть изменения в таблицу.
Вопрос: доступ к таблице осуществлять через dataAdapter, загружать в dataSet? Можно ли создать 9 разных dataView к таблице в dataSet и выводить их в DataGridView? и можно ли, и каким образом осуществлять редактирование измененных данных через эти dataView в таблице dataSet, а затем и в таблице Оракл?
и как обновлять ? строку ,где были изменения или сразу все строки , которые видны в DataGridView?
Я сначала все сделала через dataReader, выборка данных на основе разных запросов, редактирование, обновить данные через executeNONQuery и теперь вот задаюсь вопросом , а правильно ли это?
Спасибо!

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: vb net, RichTextBox, Oracle

Сообщение ark » 29.09.2012 (Сб) 10:43

Anta писал(а):Можно ли создать 9 разных dataView к таблице в dataSet
Зачем 9 разных? dSet.Tables("tablName").DefaultView.RowFilter="blah_blah" - это если DataGridView напрямую к таблице привязана через DataSource. Если к DataSet, а таблица через dataMember:
Код: Выделить всё
Dim cm As CurrencyManager = CType(DataGridView1.BindingContext(dSet, "TableName"), CurrencyManager)
CType(cm.Current, DataView).RowFilter = "blah_blah"
. Если через BindingSource, то bs.Filter="...."
А редактировать можно прямо в таблице.

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 03.10.2012 (Ср) 2:55

ark писал(а):
Anta писал(а):Можно ли создать 9 разных dataView к таблице в dataSet
Зачем 9 разных? dSet.Tables("tablName").DefaultView.RowFilter="blah_blah" - это если DataGridView напрямую к таблице привязана через DataSource. Если к DataSet, а таблица через dataMember:
Код: Выделить всё
Dim cm As CurrencyManager = CType(DataGridView1.BindingContext(dSet, "TableName"), CurrencyManager)
CType(cm.Current, DataView).RowFilter = "blah_blah"
. Если через BindingSource, то bs.Filter="...."
А редактировать можно прямо в таблице.

DataGridView привязана через DataSet, и задача поставлена так, что пользователь должен выбрать радиобутон и/или чекбокс и на основе этого выводить данные из таблицы, у меня получилось 9 комбинаций запросов к таблицы, я думала: выбрал пользователь первую комбинацию-привязать к DataGridView первый DataView1, выбрал вторую комбинацию-очистить DataGridView и вывести туда DataView2 и так далее... я не совсем поняла второй подход, котрый вы привели...

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 04.10.2012 (Чт) 3:06

Разобралась, все работает, спасибо. А можно ли использовать каким-нибудь образом в коде vb net процедуру, написанную на pl/sql?

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: vb net, RichTextBox, Oracle

Сообщение ark » 06.10.2012 (Сб) 12:23

Anta писал(а):написанную на pl/sql?
В смысле stored procedure?
Код: Выделить всё
Dim cmd As New SqlClient.SqlCommand("sp_DoSomething", conn)
cmd.CommandType = CommandType.StoredProcedure
With cmd.Parameters
    .AddWithValue("@varA", _varA)
    .AddWithValue("@VarB", _varB)
End With
cmd.ExecuteNonQuery()

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 10.10.2012 (Ср) 2:42

ark писал(а):
Anta писал(а):написанную на pl/sql?
В смысле stored procedure?
Код: Выделить всё
Dim cmd As New SqlClient.SqlCommand("sp_DoSomething", conn)
cmd.CommandType = CommandType.StoredProcedure
With cmd.Parameters
    .AddWithValue("@varA", _varA)
    .AddWithValue("@VarB", _varB)
End With
cmd.ExecuteNonQuery()

Спасибо за ответ, вы имеете ввиду "sp_DoSomething" уже создана в БД оракл и через VB запустить ее на выполнение?
Задача заключалась в том, что в каждой схема Оракл имеется идентичная таблица и нужно выполнить запрос ко всем схемам select union all и показать результат в datagridview. В принципе, мне удалось с помощью datareader в цикле просмотреть все схемы, где такая таблица существует, и результаты загрузить в datatable и подключить datagridview вот таким образом в конце:dim table1 as datatable, table1.Load(OBJdatareader), DGV.datasource=table1.
Есть необходимость фильтрации этой самой table1. Я хотела создать dataview с filter по необходимому столбцу и загружать снова данные в datagridview, но получаю ошибку. С чем это может быть связано? И видимо модификация данных в так построенной таблице table1 и их возврат в БД будет затруднительной? Возможно у кого-то есть предложения как другим способом сделать выборку и всех схем БД: select union all , загрузить в datagridview, построить фильтры и иметь возможность вернуть модифицированные данные в схемы Оракл? Спасибо

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: vb net, RichTextBox, Oracle

Сообщение ark » 12.10.2012 (Пт) 11:37

Anta писал(а):В принципе, мне удалось с помощью datareader в цикле просмотреть все схемы
А что мешает загрузить SELECT UNION ALL с нужным WHERE в таблицу сразу через DataAdapter?
Anta писал(а):И видимо модификация данных в так построенной таблице table1 и их возврат в БД будет затруднительной
Если лень врукопашную UPDATE и INSERT писать - DataAdapter сам их сгенерирует по SELECT'у.
Anta писал(а): Я хотела создать dataview с filter по необходимому столбцу и загружать снова данные в datagridview
Не надо ничего "загружать снова" в гриду - там уже DefaultView загружен. table1.DefaultView.RowFilter="fieldName='abcdef'" - и грида отобразит отфильтрованные записи table1. table1.DefaultView.RowFilter=String.Empty - убрать фильтр

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 12.10.2012 (Пт) 14:49

ark писал(а):А что мешает загрузить SELECT UNION ALL с нужным WHERE в таблицу сразу через DataAdapter?

выборка происходит из 100 схем, в каждой схеме есть идентичная таблица, но разные данные, с результатом такого select union all и нужно работать.
я бы хотела загрузить это в dataset и потом в 1 таблицу, как это можно сделать? а затем делать update, но как вернуть данные в разные схемы из одной таблицы datatable?
вот часть кода,который выполняет выборку в 1 datatable через datareader или вариант 2 в dataset
Код: Выделить всё
For i = Users.Rows.Count - 1 To 0 Step -1

                If nb_table = 1 Then
                    ma_requete = "SELECT * FROM " + Users.Rows(0).Item("usernom") + ".LBPA_CMD_CADASTRE"
                Else : ma_requete = "SELECT * FROM " + Users.Rows(i).Item("usernom") + ".LBPA_CMD_CADASTRE ORDER BY CODE_MUN, NO_CMD"

                    With cmdAllTable
                        .Connection = ObjConn
                        .CommandType = CommandType.Text
                        .CommandText = ma_requete
                    End With

                    '-----------var1 rabotaet!-------------
                    ReaderAllSchemas = cmdAllTable.ExecuteReader
                    LBPA_CMD_CADASTRE_All.Load(ReaderAllSchemas)
                    ReaderAllSchemas.Close()
                    '-----------var1-------------

                    '-----------var2rabotaet!-------------
                    'cmdObj = New OleDbCommand(ma_requete, ObjConn)
                    ' ObjAdapter = New OleDbDataAdapter(cmdObj)
                    'ObjAdapter.Fill(ObjDataSetCMD, "LBPA_CMD_CADASTRE_All")
                    ' LBPA_CMD_CADASTRE_All = ObjDataSetCMD.Tables("LBPA_CMD_CADASTRE_All")

                    '-----------var2-------------

                End If
                compt = compt + 1
            Next

oба варианта работают,но не знаю каким образом осуществить update, возможно мой подход не правильный?
во вотором случае пыталась написать update:
Код: Выделить всё
Try
            Try
                ObjConn.Open()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Message d'alerte", MessageBoxButtons.OK, MessageBoxIcon.Error)

            End Try

            ObjetCommandBuilder = New OleDbCommandBuilder(ObjAdapter)
            ObjAdapter.Update(ObjDataSetAll, "LBPA_CMD_CADASTRE_All")
            ObjDataSetAll.Clear()
            ObjAdapterAll.Fill(ObjDataSetAll, "LBPA_CMD_CADASTRE_All")
            LBPA_CMD_CADASTRE_All = ObjDataSetAll.Tables("LBPA_CMD_CADASTRE_All")
            MsgBox("Update success!")
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Message d'alerte", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
        Try
            ObjConn.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Message d'alerte", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

но получаю ошибку, такой таблицы не уществует, да физически она не существует, ведь она результат выборки из 100 схем,из 100 идентичных таблиц. вот я и в тупике, нужно делать построчное считывание и возврат в схемы?

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 13.10.2012 (Сб) 3:04

Каким образом можно найти в datagridview измененные данные и сделать Update таблицы только для этих данных через ExecuteNoQuery?

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: vb net, RichTextBox, Oracle

Сообщение ark » 13.10.2012 (Сб) 5:53

Честно говоря, не спец в Qracle. Кстати, CommandBuilder строит команды ТОЛЬКО если в таблице есть ключевое поле. Что касается SQL - для итоговой таблицы можно сделать и всего один запрос, что нибудь типа:
Код: Выделить всё
Dim strSQL As String
For i = Users.Rows.Count - 1 To 0 Step -1
   If Not String.IsNullOrEmpty(strSQL) Then strSql+=" UNION ALL" & vbcrlf
   strSQL+="SELECT *,UserID='" &  Users.Rows(0).Item("usernom") & "' FROM " + Users.Rows(i).Item("usernom") + ".LBPA_CMD_CADASTRE"
   If nb_table<>1 Then strSQL+=" ORDER BY CODE_MUN, NO_CMD"
Next
Dim da As New OleDbDataAdapter(strSQL,connString)
da.Fill(yourTable)
grid.DataSource=yourTable

Я добавил колонку UserID в итоговую таблицу, чтобы потом строить UPDATE и INSERT. Эту колонку в гриде можно сделать невидимой или ReadOnly. Теперь можно фильтровать yourTable.DefaultView - грида отобразит отфильтрованные записи. При сохранении :
Код: Выделить всё
cmd.Parameters.Add(@field1, OleDbType.VarChar, 15)
cmd.Parameters.Add(@field2, OleDbType.Integer)
cmd.Parameters.Add(@idColumn, OleDbType.Integer)

For each dr as DataRow In yourTable.Select("","",DataViewRowState.ModifiedCurrent)
    cmd.CommandText = "UPDATE [" & dr("UserID") & ".LBPA_CMD_CADASTRE] SET field1=?,field2=? WHERE idColumn=?"
    cmd.Parameters("@field1").Value=dr("Field1")
    cmd.Parameters("@field2").Value=dr("Field2")
    cmd.Parameters("@idColumn").Value=dr("idColumn")
    cmd.ExecuteNonQuery
Next
For each dr as DataRow In yourTable.Select("","",DataViewRowState.Added)
    cmd.CommandText = "INSERT INTO  [" & dr("UserID") & ".LBPA_CMD_CADASTRE (field1,field2) Values (?,?)"
    cmd.Parameters("@field1").Value=dr("Field1")
    cmd.Parameters("@field2").Value=dr("Field2")
    cmd.ExecuteNonQuery
Next
For each dr as DataRow In yourTable.Select("","",DataViewRowState.Deleted)
    cmd.CommandText = "DELETE  [" & dr("UserID") & ".LBPA_CMD_CADASTRE] WHERE idColumn=?"
    cmd.Parameters("@idColumn").Value=dr("idColumn")
    cmd.ExecuteNonQuery
Next

Anta
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 106
Зарегистрирован: 19.08.2012 (Вс) 22:00

Re: vb net, RichTextBox, Oracle

Сообщение Anta » 16.10.2012 (Вт) 3:05

ark писал(а):Я добавил колонку UserID в итоговую таблицу, чтобы потом строить UPDATE и INSERT. Эту колонку в гриде можно сделать невидимой или ReadOnly. Теперь можно фильтровать yourTable.DefaultView - грида отобразит отфильтрованные записи. При сохранении :
Спасибо за предложенное решение!!! Update работает!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList  
cron