Database 从数据库读/写代码时设计代码流的最佳方法

Database 从数据库读/写代码时设计代码流的最佳方法,database,vb.net,data-structures,Database,Vb.net,Data Structures,因此,我正在尝试我的一个概念工具,我需要能够读写数据库中的数据非常容易。我已经按照自己的喜好设置了表单,并在不同的文本框和下拉框中展开,以从数据库中读取数据。我已经做好了所有的工作,但是有一个小错误,我不完全理解为什么会出现。某些文本框不会更新数据库中的文本。但它似乎只有在数据库中的数据为空时才会发生。因此,最后一行的值仍然挂起在文本框中,因此,单击“更新”实际上会将最后一行字段中的值更新到新行中。把一切都搞砸了 现在,我最感兴趣的是代码的剪切流。设计代码来完成所有这些工作的最佳方式是什么?到目

因此,我正在尝试我的一个概念工具,我需要能够读写数据库中的数据非常容易。我已经按照自己的喜好设置了表单,并在不同的文本框和下拉框中展开,以从数据库中读取数据。我已经做好了所有的工作,但是有一个小错误,我不完全理解为什么会出现。某些文本框不会更新数据库中的文本。但它似乎只有在数据库中的数据为空时才会发生。因此,最后一行的值仍然挂起在文本框中,因此,单击“更新”实际上会将最后一行字段中的值更新到新行中。把一切都搞砸了

现在,我最感兴趣的是代码的剪切流。设计代码来完成所有这些工作的最佳方式是什么?到目前为止,我得到了这个:

这是单击datagridview中的单元格时的代码:

“选定”变量都在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
我以前真的没有做过这样的事。我更像是一个设计师而不是程序员,但我真的需要尝试一个概念,所以我不确定这是一种什么样的方法。我发现它在大多数情况下都是有效的。但我认为熟练的程序员有一种设计代码布局的方法,因此它高效、干净且易于阅读。
那么这看起来怎么样呢?

试着在下一步的错误恢复中注释一下,看看会发生什么。我对那句话感到困惑的次数多得数不清

编辑

我刚刚意识到这是VB.Net。在这种情况下,您永远不应该使用On Error Resume Next。使用结构。

(顺便说一句,我在问题中看不到任何与数据库相关的内容)

也许最好的方法是。。。不可以。不要为标准数据绑定框架能够处理的事情编写代码。例如(抱歉,它是C#,但它应该翻译-这里所有的“好”部分都是由.NET framework提供的,而不是语言);某些UI代码-注意:没有用于复制值的代码:

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);
        }
    }
}
静态类程序{
[状态线程]
静态void Main(){
Application.EnableVisualStyles();
//一些样本数据
BindingList轨迹=新建BindingList();
添加(新曲目{Name=“foo”,Genre=“Rock”,节奏=“疯狂”,长度=180});
添加(新曲目{Name=“bar”、Genre=“Classic”、节奏=“statese”、长度=240});
//在表单上显示数据
使用(表格=新表格){
控件={
新DataGridView{DataSource=tracks,Dock=DockStyle.Fill},
新文本框{DataBindings={“Text”,曲目,“Name”},Dock=DockStyle.Bottom},
新的文本框{DataBindings={{“Text”,tracks,“Genre”},Dock=DockStyle.Bottom},
新的文本框{DataBindings={“Text”,曲目,“节奏”},Dock=DockStyle.Bottom},
新的文本框{DataBindings={“Text”,tracks,“Length”},Dock=DockStyle.Bottom},
}
}) {
申请表格;
}
}
}
支持数据实体:

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"); } }
}
类轨迹:INotifyPropertyChanged{
私人弦乐名称、流派、节奏;
私有整数长度;
公共事件属性更改事件处理程序属性更改;
私有void设置字段(参考T字段、T值、字符串属性名称){
如果(!EqualityComparer.Default.Equals(字段,值)){
字段=值;
PropertyChangedEventHandler处理程序=PropertyChanged;
if(handler!=null)handler(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共字符串名称{get{return Name;}set{SetField(ref Name,value,“Name”);}
公共字符串类型{get{return Genre;}set{SetField(ref Genre,value,“Genre”);}
公共字符串节奏{get{return THERMAT;}set{SetField(参考节奏,值,“节奏”);}
公共整数长度{get{return Length;}set{SetField(ref-Length,value,“Length”);}
}

好的,我将尝试这样做,看看会发生什么。如果单元格中的值为零,您知道如何让代码继续运行吗?最好的提示!你可能知道,我不是真正的程序员。所以这个任务实际上与-如何真正绑定数据相关:)只是尝试将文本框的值数据绑定到数据库中的列。它工作得很好,没有更多的bug:)但是,数据没有存储。尝试插入以下内容:DataSourceDataSet.Songs.AcceptChanges()SongStableApter.Update(Me.DataSourceDataSet.Songs),但数据库中的数据未更新请注意您的评论-老实说,我对适配器了解不多(我使用ORM,而不是DataSet)。也许可以问另一个具体问题?
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"); } }
}