Здравствуйте! Сегодня: Чт, 22 Окт 2020, Ваш IP: 3.238.62.144 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Базы данных
+ Создать новую тему Страница: 1
Тема: Текстовый файл - вместо файла Базы Данных · +x2 +  дата добавления: 26.09.2011 / 13:17
Автор темы:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


По мере использования своего первого приложения, я обнаружил,что самая не надёжная часть в ней - база данных , сформированная в MS Access.Возможно, что причина не стабильной работы заключается в моей неопытности. Но, всё-таки... хотелось бы поинтересоваться у искушённых программистов : " На сколько правильна моя мысль, относительно того, что-бы отказаться от файла Базы Данных MS Access и перейти на более простую схему обмена данными - создать текстовый файл и, пользуясь приложением, складывать в сей файл данные, внесённые в textbox одной Формы, произвести выборку определённых данных в этом файле и помещать в другую Форму. Подойдёт ли в этом случае метод использования StreamReader ?"
Технологии: Visual Basic .NET
 
Ответ # 1 # · +  +  дата добавления: 26.09.2011 / 19:04
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Зависит от количества и структуры данных, а также сложности их выборки. Если данных немного и их нужно просто вывести как есть, то обычные текстовые файлы вполне сгодятся. Если структура более сложная, то можно еще посмотреть в сторону XML, но для большого объема данных и сложными условиями выборки все же лучше использовать базу.

Вместо Access, если есть возможность, лучше использовать SQL Server, он гораздо шустрее работает, да и возможностей больше.
 
Ответ # 2 # · +x1 +  дата добавления: 26.09.2011 / 20:21
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


Сама структура данных предполагается простой: в файл загружаются данные из текстбоксов и там хранятся в виде строк.А вот что-бы выдернуть оттуда две строки, например, хранящие связанные имя и дату ,не хватает знаний в этой области.Когда в файле всего одна запись, тогда всё проще пареной репы. А если там записи накапливаются..?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'Создаем объект для записи информации в текстовый файл:
Dim Запись As New System.IO.StreamWriter("C:\Данные\Текст.txt", True)
'Записываем в файл 3 строки:

Запись.WriteLine(txtНомер.Text)
Запись.WriteLine(txtИмя.Text)
Запись.WriteLine(txtДата.Text)
Запись.Close() 'Закрываем файл
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

'Создаем объект для чтения информации из текстового файла:
Dim Чтение As New System.IO.StreamReader("C:\Данные\Текст.txt")
'Подготавливаем 3 переменные для хранения информации из текстового файла:
Dim Число As Integer
Dim Строка As String
Dim Дата As DateTime
'Считываем 3 строки из файла:
Число = Чтение.ReadLine
Строка = Чтение.ReadLine
Дата = Чтение.ReadLine
Чтение.Close() 'Закрываем файл
txtНомер.Text = Число
txtИмя.Text = Строка
txtДата.Text = Дата

End Sub
Технологии: Visual Basic .NET
 
Ответ # 3 # · +  +  дата добавления: 26.09.2011 / 21:00
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 0 / ответов: 20 / благодарностей: 3 / репутация: 0
ответов: 20
создал(а) тем: 0


Dim row As Integer = 0
 Dim sReadLine As String = ""
 While True
   sReadLine = Чтение.ReadLine()
   If sReadLine Is Nothing Then
     Exit While
   Else
      'читаем три строки
 Dim Число As Integer
Dim Строка As String
Dim Дата As DateTime
'Считываем оставшиеся 2 строки из файла:
Число = sReadLine 
Строка = Чтение.ReadLine
Дата = Чтение.ReadLine 
      'увеличиваем счетчик логических строк
      row += 1
   End If
 End While
По счетчику можно выделить данные только определенной логической строки.
Еще можно хранить колонки не в разных строках, а в одной, разделяя каким-нибудь символом, например, TAB. Для разделения колонок нужно будет использовать функцию Split, которая возвращает массив строк.

ps: пишу с телефона, завтра может приведу более нормальные примеры.
 
Ответ # 4 # · +  +  дата добавления: 27.09.2011 / 16:51
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


Попробовал поменять код для записи данных в файл с разделением строки.Но где-то сидит ошибка и разделения строки не происходит.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Создаем объект для записи информации в текстовый файл:
Dim Запись As New System.IO.StreamWriter("C:\Данные\Текст.txt", True)
'формируем строку из введённых данных в текстовые поля
Dim myRow As String = txtНомер.Text & txtИмя.Text & txtДата.Text
'объявляем массив строк
Dim Раздел() As String
Раздел = myRow.Split(" ")
Запись.WriteLine(myRow)
Запись.Close() 'Закрываем файл
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Чтение As New System.IO.StreamReader("C:\Данные\Текст.txt")
Dim row As Integer = 0
Dim sReadLine As String = ""
While True
sReadLine = Чтение.ReadLine()
If sReadLine Is Nothing Then
Exit While
Else
TextBox5.Text = Чтение.ReadToEnd()
End If
End While
End Sub
 
Ответ # 5 # · +  +  дата добавления: 27.09.2011 / 17:06
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Все перепутано :)
Dim myRow As String = txtНомер.Text & txtИмя.Text & txtДата.Text
вот тут не хватает символа-разделителя.
Запись.WriteLine(myRow)
записать массив не выйдет, ибо ожидается строка.

При записи, скорей всего будет примерно так:
Запись.WriteLine(txtНомер.Text & " " & txtИмя.Text & " " & txtДата.Text)
TextBox5.Text = Чтение.ReadToEnd()
После ReadToEnd данных в потоке не будет.

При чтении, скорей всего код будет примерно таким:
sReadLine = Чтение.ReadLine()
 If sReadLine Is Nothing Then
 Exit While
 Else
  Dim myRow As String = Чтение.ReadLine()
  Dim Раздел() As String
  Раздел = myRow.Split(" ")
  txtНомер.Text = Раздел(0)
  txtИмя.Text = Раздел(1) 
  txtДата.Text = Раздел(2)
 End If
 
Ответ # 6 # · +  +  дата добавления: 27.09.2011 / 17:22
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Вот пример.

+ TextDB.zip (24,13 Кб)  
Ответ # 7 # · +x1 +  дата добавления: 27.09.2011 / 18:31
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


Алексей, ответ #5-рабочий ! Ты-настоящий эксперт, знаток в данной области знаний.С твоей помощью я по-тихохоньку приближаюсь к тому моменту, когда приложение, наконец, приобретёт тот вид, который мне хотелось-бы видеть, т.е. радовать своей стабильной работой.Честно говоря, на теме обмена данными я споткнулся.Спасибо, Алексей, за последний пример в Зипе, там (для меня) есть где подчерпнуть "свеженького". Пока в том примере "поковыряюсь".
 
Ответ # 8 # · +  +  дата добавления: 28.09.2011 / 11:28
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


Строка с кодом, расположенная ниже, помечена компилятором как строка с ошибкой: Ошибка 1 "Count" не является членом "System.Array".Не могу разобраться в причине её появления.

Label3.Text = TextBox4.Text.Split(vbCrLf).Count
 
Ответ # 9 # · +  +  дата добавления: 28.09.2011 / 12:00
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


У массивов, вместо Count, нужно использовать Length.
А Count - это для коллекций.
 
Ответ # 10 # · +x1 +  дата добавления: 28.09.2011 / 13:49
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


Пытался путём включения логики понять принцип кода (String.Format("{0}{3}{1}{3}{2}", TextBox1.Text, TextBox2.Text, TextBox3.Text, vbTab),выделенный красным цветом,результат нулевой.Алексей, поясни,пожалуйста,принцип построения строки, относительно выше указанного примера форматирования.
 
Ответ # 11 # · +  +  дата добавления: 28.09.2011 / 14:02
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


String.Format - это функция. Первый параметр - это шаблон строки. В фигурных скобках числа - индекс от нуля, вместо которых будут вставлены другие параметры, идущие после шаблона. В данном случае в шаблон строки будут вставлены значения TextBox1.Text, TextBox2.Text, TextBox3.Text, vbTab.
{0} - TextBox1.Text
{1} - TextBox2.Text
{2} - TextBox3.Text
{3} - символ TAB
т.е. это равносильно:
TextBox1.Text & vbTab & TextBox2.Text & vbTab & TextBox3.Text

Шаблон может быть любым и содержать, помимо индексов подстановки, любые другие строковые данные. Например:
String.Format("Имя пользователя: {0}{3}Пол: {1}{3}Дата рождения: {2}", TextBox1.Text, TextBox2.Text, TextBox3.Text, vbTab)
что равносильно:
"Имя пользователя: " & TextBox1.Text & vbTab & "Пол: " & TextBox2.Text & vbTab & "Дата рождения: " & TextBox3.Text
 
Ответ # 12 # · +  +  дата добавления: 28.09.2011 / 14:09
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Еще, String.Format, позволяет более гибко форматировать данные (числа, даты).
 
Ответ # 13 # · +x1 +  дата добавления: 29.09.2011 / 17:49
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


Спасибо! С последним разобрался, двигаюсь дальше.
 
Ответ # 14 # · +  +  дата добавления: 05.10.2011 / 16:33
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


На программном поиске нужной строки с датой и именем я опять споткнулся: здесь иду вслепую и часами напролёт подбираю нужный алгоритм построения задачи. Алексей, подскажи,пожалуйста, как же построить код таким образом, при котором записывается строка, в которой сидит дата, со временем совпавшая с Today? Или, хотя-бы, принцип выполнения этой задачи?
  Dim FS As New FileStream("data.txt", FileMode.Open, FileAccess.Read, FileShare.Inheritable)
    Dim SR As New StreamReader(FS, System.Text.Encoding.UTF8)
    Dim i As Integer = 1
    TextBox4.Text = SR.ReadToEnd()
    'объявляем переменную,содержащую строки в текстовом поле
    Dim row() As String = TextBox4.Lines
    row(i) = i + 1
    Dim cols() As String = row(i).Split(vbTab)
    Dim Строка As String
    'разбиваем на колонки
    Label10.Text = cols(0)
    Label11.Text = cols(1)
    Label12.Text = cols(2)
    Label13.Text = cols(3)
    'форматируем колонки
    Dim t1 As Date
    cols(0) = (Format(t1, "Long Date"))
    cols(1) = (Format(Text))
    cols(2) = (Format(Text))
    cols(3) = (Format(Text))

    If Строка = row(i) And cols(0) = Today Then   'если в поиске строки нашлась строка с Today(первая запись в строке-  дата),тогда записать строку в метке или текстовом поле
      Label9.Text = Строка
    Else : Label9.Text = "Сегодня среди Ваших друзей нет именинников"
    End If
 
Ответ # 15 # · +  +  дата добавления: 05.10.2011 / 16:45
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Проверить дату можно при помощи функции DateDiff:
If Строка = row(i) And DateDiff(DateInterval.Day, CType(cols(0), Date), Now) = 0 Then
  '...
End If
 
Ответ # 16 # · +  +  дата добавления: 05.10.2011 / 17:58
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


При выполнении кода выпадает предупреждение о переменной "Строка",которая используется до присвоения ей значения с возможностью события исключения, и компилятор останавливается на строке 12 Label11.Text = cols(1) с пояснением о выходе за пределы массива.Этот сценарий происходил до того, как ты предложил проверить функцию DateDiff,на которую я возлагаю свои надежды, но пока не могу ей воспользоваться.

 
Ответ # 17 # · +x1 +  дата добавления: 06.11.2011 / 07:55
Автор ответа:
Scryaga
Scryaga
тем: 16 / ответов: 53 / благодарностей: 1 / репутация: 20
Чашка Kbyte.Ru>>
ответов: 53
создал(а) тем: 16


После решения проблем с доступом в иннет, первым делом заглянул на данный форум.
Привет, Алексей! За последний мой ответ мне, честно говоря, стыдно, как никогда! (Это с высоты сего дня) Для того, что-бы решить проблему разделения строки на нужные мне значения, я прибег к другому способу разделения, т.е из каждого TextBox-а введённая запись попадает в свой отдельный файл. На форме другие текстовые поля считывают и принимают строки из файлов.Для примера - класс для формы2

Private Sub Добавление_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Добавление.Click
Using FS As New FileStream("dates.txt", FileMode.Append, FileAccess.Write, FileShare.Inheritable)
Using FS1 As New FileStream("names.txt", FileMode.Append, FileAccess.Write, FileShare.Inheritable)
Using SW As New StreamWriter(FS, System.Text.Encoding.UTF8)
Using SW1 As New StreamWriter(FS1, System.Text.Encoding.UTF8)
SW.WriteLine(DateTimePicker1.Text)
SW1.WriteLine(txt_name.Text)
End Using
End Using
End Using
End Using
If Not String.IsNullOrEmpty(txt_date.Text) Then txt_date.Text &= vbCrLf
If Not String.IsNullOrEmpty(txt_names.Text) Then txt_names.Text &= vbCrLf

txt_date.Text &= DateTimePicker1.Text
txt_names.Text &= txt_name.Text
DateTimePicker1.Text = ""
txt_name.Text = ""
End Sub

Private Sub ReadAllData()
If Not File.Exists("dates.txt") Then Return 'файл не существует, читать нечего
Using FS As New FileStream("dates.txt", FileMode.Open, FileAccess.Read, FileShare.Inheritable)
If Not File.Exists("names.txt") Then Return 'файл не существует, читать нечего
Using FS1 As New FileStream("names.txt", FileMode.Open, FileAccess.Read, FileShare.Inheritable)
Using SR As New StreamReader(FS, System.Text.Encoding.UTF8)
txt_date.Text = SR.ReadToEnd()
Using SR1 As New StreamReader(FS1, System.Text.Encoding.UTF8)
txt_names.Text = SR1.ReadToEnd()
End Using
End Using
End Using
End Using
End Sub

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ReadAllData()
Label5.Text = "Сегодня среди Ваших друзей нет именинников"
'Dim d As Date = Now
'DateTimePicker1.Text = (Format(d, "Long Date"))
txt_name.Text = ""
Label4.Text = "Сегодня" & " " & Now.DayOfYear & " " & "день года"
Label4.ForeColor = Color.FromArgb(50, 110, 10, 110)
Label4.BackColor = Color.Snow
Именинник()
End Sub

Public Sub Именинник()
Dim nom As Integer 'счётчик строк
nom = CInt(txt_date.Text.Split(vbCrLf).Length) 'находим длину массива дат(можно и - имён)
Dim d() As String = txt_date.Lines 'переменная для массива дат
Dim n() As String = txt_names.Lines 'переменная для массива имён
Dim i As Integer = 1
For i = 1 To nom - 1
If d(i) = DateTimePicker1.Text Then
Label5.Text = "Сегодня свой День Рождения справляет" & " " & n(i) & "!"
Label5.ForeColor = Color.FromArgb(50, 110, 0, 0)
If d(i) <> DateTimePicker1.Text Then
Label5.Text = "Сегодня среди Ваших друзей нет именинников"
End If
End If
Next i
End Sub
Технологии: Visual Basic .NET
 
Ответ # 18 # · +  +  дата добавления: 12.10.2012 / 00:08
Автор ответа:
v4-94
v4-94
тем: 0 / ответов: 2 / благодарностей: 0 / репутация: 0
ответов: 2
создал(а) тем: 0


Aleksey Nemiro . Подскажите как редактировать уже внесенную в базу информацию, на примере вашей программы "TextDb". за ранее благодарю.
Технологии: Visual Basic .NET
 
Ответ # 19 # · +  +  дата добавления: 12.10.2012 / 00:21
Автор ответа:
v4-94
v4-94
тем: 0 / ответов: 2 / благодарностей: 0 / репутация: 0
ответов: 2
создал(а) тем: 0


И еще вопрос. Как реализовать, например умножение.деление значении в texbox.
 
Страница: 1 + Создать новую тему