Лучший способ проектирования потока кода при чтении / записи из базы данных - PullRequest
1 голос
/ 08 августа 2009

Итак, я опробовал свой концептуальный инструмент, где мне нужно было бы иметь возможность легко читать и записывать данные из базы данных. Я настроил форму так, как мне нравится, и распределил ее по разным текстовым полям и выпадающим спискам для чтения данных из базы данных. И у меня все это работает и все, но есть небольшая ошибка, я не до конца понимаю, почему это так. Некоторые текстовые поля не обновляют текст из базы данных. Но, похоже, это происходит, только если данные в базе данных ничто. Таким образом, значение из последней строки все еще висит в текстовом поле и, таким образом, нажатие «Обновить» фактически обновляет значение из поля из последней строки в новую строку. Все испортил.

Теперь, что меня больше всего интересует, это сдвиговый поток кода. Какой лучший способ выложить код для всего этого? Пока у меня есть это:

Это код при нажатии на ячейку в сетке данных:

Private Sub DataGridView_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView.CellClick

    On Error Resume Next   

    selectedName = Me.DataGridView.CurrentRow.Cells(0).Value
    selectedGenre = Me.DataGridView.CurrentRow.Cells(1).Value
    selectedRhytm = Me.DataGridView.CurrentRow.Cells(2).Value
    selectedLength = Me.DataGridView.CurrentRow.Cells(3).Value
    selectedFinished = Me.DataGridView.CurrentRow.Cells(4).Value
    selectedSoundFile = Me.DataGridView.CurrentRow.Cells(5).Value

    txtBoxName.Text = selectedName
    txtBoxGenre.Text = selectedGenre
    txtBoxRhytm.Text = selectedRhytm
    txtBoxLength.Text = selectedLength
    txtBoxFinished.Text = selectedFinished
    txtBoxSoundFile.Text = selectedSoundFile

End Sub

«Выбранные» -варианты все объявлены в GlobalCode.vb, который я получил, где я создаю их все для использования позже. Они определены так:

Friend Module GlobalVariables

    Friend selectedName As String = Nothing
    Friend selectedGenre As String = Nothing
    Friend selectedRhytm As String = Nothing
    Friend selectedLength As String = Nothing
    Friend selectedFinished As String = Nothing
    Friend selectedSoundFile As String = Nothing


End Module

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

Ответы [ 2 ]

2 голосов
/ 08 августа 2009

(я не вижу ничего, что связано с базой данных в вопросе, кстати)

Возможно, лучший способ выложить этот код ... не надо. Не пишите код для вещей, с которыми могут справиться стандартные рамки привязки данных. Например (извините, это C #, но его следует перевести - все «хорошие» биты здесь предоставляются платформой .NET, а не языком); некоторый код пользовательского интерфейса - обратите внимание, нет кода для копирования значений:

static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        // some sample data
        BindingList<Track> tracks = new BindingList<Track>();
        tracks.Add(new Track { Name = "foo", Genre = "Rock", Rhythm = "insane", Length = 180 });
        tracks.Add(new Track { Name = "bar", Genre = "Classic", Rhythm = "sedate", Length = 240 });

        // show the data on a form
        using (Form form = new Form {
            Controls = {
                new DataGridView { DataSource = tracks, Dock = DockStyle.Fill },
                new TextBox { DataBindings = {{"Text", tracks, "Name"}}, Dock = DockStyle.Bottom},
                new TextBox { DataBindings = {{"Text", tracks, "Genre"}}, Dock = DockStyle.Bottom},
                new TextBox { DataBindings = {{"Text", tracks, "Rhythm"}}, Dock = DockStyle.Bottom},
                new TextBox { DataBindings = {{"Text", tracks, "Length"}}, Dock = DockStyle.Bottom},
            }
        }) {
            Application.Run(form);
        }
    }
}

С поддержкой объекта данных:

class Track : INotifyPropertyChanged {
    private string name, genre, rhythm;
    private int length;
    public event PropertyChangedEventHandler PropertyChanged;
    private void SetField<T>(ref T field, T value, string propertyName) {
        if (!EqualityComparer<T>.Default.Equals(field, value)) {
            field = value;
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public string Name { get { return name; } set { SetField(ref name, value, "Name"); } }
    public string Genre { get { return genre; } set { SetField(ref genre, value, "Genre"); } }
    public string Rhythm { get { return rhythm; } set { SetField(ref rhythm, value, "Rhythm"); } }
    public int Length { get { return length; } set { SetField(ref length, value, "Length"); } }
}
0 голосов
/ 08 августа 2009

Попробуйте немного прокомментировать сообщение об ошибке Resume Next и посмотрите, что произойдет. Я сумел запутать себя больше раз, чем могу сосчитать с этим утверждением.

EDIT

Я только что понял, что это VB.Net. Вы никогда не должны использовать On Error Resume Next в этом случае. Используйте Try Catch структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...