【问题标题】:Inherit Datatable object继承数据表对象
【发布时间】:2017-03-13 13:57:03
【问题描述】:

我正在使用 C# 解决方案,我有这个表单,我正在填充我的 txtboxes,使用 DataTable 对象,然后通过行号检索信息,问题是,我有导航按钮,下一个和上一个,我只是注意到当我将我的函数调用到 PopulateView();按下此按钮后,我重做 DB 连接、SQLite 查询和数据表填充。

我感到很惭愧,但我真的不知道在哪里放置这个函数以便我的其他函数以这种形式接收这些对象。

我的代码:

namespace X_Project{
public partial class Cad_Prod : Form
{
    System.Data.SQLite.SQLiteConnection conn1 = new System.Data.SQLite.SQLiteConnection("data source=X.s3db");
    int prodstart = 0;
    public Cad_Prod()
    {
        InitializeComponent();
    }

    public void Cad_Prod_Load(object sender, EventArgs e)
    {

    }

    private void PopulateView()
    {
        string query = "SELECT * FROM Cad_Prod";
        string query2 = "SELECT * FROM Cat";
        try
        {
            using (SQLiteCommand comm = new SQLiteCommand(query, conn1))
            using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(comm))
            using (SQLiteCommand comm2 = new SQLiteCommand(query2, conn1))
            using (SQLiteDataAdapter adapter2 = new SQLiteDataAdapter(comm2))
            {
                conn1.Open();
                DataTable produtos = new DataTable();
                adapter.Fill(produtos);
                DataTable categoria = new DataTable();
                adapter2.Fill(categoria);

                int auxCat = int.Parse(produtos.Rows[prodstart].ItemArray[4].ToString()) - 1;

                txtProdutoNome.Text = produtos.Rows[prodstart].ItemArray[1].ToString();
                txtProdutoPreco.Text = produtos.Rows[prodstart].ItemArray[2].ToString();
                txtProdutoQtd.Text = produtos.Rows[prodstart].ItemArray[3].ToString();
                cbbCategoria.Text = categoria.Rows[auxCat].ItemArray[1].ToString();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void btnAvancar_Click(object sender, EventArgs e)
    {
        prodstart = prodstart + 1;
        PopulateView();
    }

    private void btnVoltar_Click(object sender, EventArgs e)
    {
        prodstart = prodstart - 1;
        PopulateView();
    }
}

上面的代码有效,但不是我想要的,我真正想做的是:

namespace X_Project\
{

public partial class Cad_Prod : Form
    {

    System.Data.SQLite.SQLiteConnection conn1 = new System.Data.SQLite.SQLiteConnection("data source=X.s3db");
    int prodstart = 0;
    public Cad_Prod()
    {
        InitializeComponent();
    }

    public void Cad_Prod_Load(object sender, EventArgs e)
    {

        string query = "SELECT * FROM Cad_Prod";
        string query2 = "SELECT * FROM Cat";
        try
        {
            using (SQLiteCommand comm = new SQLiteCommand(query, conn1))
            using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(comm))
            using (SQLiteCommand comm2 = new SQLiteCommand(query2, conn1))
            using (SQLiteDataAdapter adapter2 = new SQLiteDataAdapter(comm2))
                {
                conn1.Open();
                DataTable produtos = new DataTable();
                adapter.Fill(produtos); // I would like this to be inherited
                DataTable categoria = new DataTable();
                adapter2.Fill(categoria); // I would like this to be inherited
                }
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    private void PopulateView()
    {


                int auxCat = int.Parse(produtos.Rows[prodstart].ItemArray[4].ToString()) - 1;

                txtProdutoNome.Text = produtos.Rows[prodstart].ItemArray[1].ToString();
                txtProdutoPreco.Text = produtos.Rows[prodstart].ItemArray[2].ToString();
                txtProdutoQtd.Text = produtos.Rows[prodstart].ItemArray[3].ToString();
                cbbCategoria.Text = categoria.Rows[auxCat].ItemArray[1].ToString();

    }

    private void btnAvancar_Click(object sender, EventArgs e)
    {
        prodstart = prodstart + 1;
        PopulateView();
    }

    private void btnVoltar_Click(object sender, EventArgs e)
    {
        prodstart = prodstart - 1;
        PopulateView();
    }
}

【问题讨论】:

    标签: c# class object inheritance


    【解决方案1】:

    将数据表放置在使用“惰性初始化器”模式的表单级属性变量中,即它们被编码的位置,因此它们只会调用一次数据库,并在第一次使用数据表填充静态私有变量;每次后续调用都只会读取私有变量并跳过数据库调用。

    public partial class Cad_Prod : Form
    {
       private static readonly SQLiteConnection conn1 =
             new SQLiteConnection(("data source=X.s3db");
       private static DataTable produtos;
       private static DataTable produtos;
       private static DataTable AutoDataTable => 
          produtos?? (produtos = GetAutos());           
       private static DataTable CategoryDataTable => 
          categoria ?? (categoria = GetCategories());            
    
       int prodstart = 0;
       public Cad_Prod() { InitializeComponent(); }
    
       public void Cad_Prod_Load(object sender, EventArgs e)  {  }
       private static DataTable GetAutos()
       {
          string query = "SELECT * FROM Cad_Prod";
          try
          {
              using (SQLiteCommand comm = new SQLiteCommand(query, conn1))
              using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(comm))
              {
                conn1.Open();
                DataTable produtos = new DataTable();
                adapter.Fill(produtos); 
                return produtos;
              }
          }
          catch (Exception ex)
          {
              MessageBox.Show(this, ex.Message, "Erro", 
              MessageBoxButtons.OK, MessageBoxIcon.Error);
              throw;
          }
       }
       private static DataTable GetCategories()
       {
          string query2 = "SELECT * FROM Cat";
          try
          {
             using (SQLiteCommand comm2 = new SQLiteCommand(query2, conn1))
             using (SQLiteDataAdapter adapter2 = new SQLiteDataAdapter(comm2))
                {
                conn1.Open();
                DataTable categoria = new DataTable();
                adapter2.Fill(categoria);
                return categoria;
                }
          }
          catch (Exception ex)
          {
              MessageBox.Show(this, ex.Message, "Erro", 
              MessageBoxButtons.OK, MessageBoxIcon.Error);
              throw;
          }
      }
    
      private void PopulateView()
      {
         int auxCat = int.Parse(produtos.Rows[prodstart]
                .ItemArray[4].ToString()) - 1;
    
         txtProdutoNome.Text = produtos.Rows[prodstart]
                .ItemArray[1].ToString();
         txtProdutoPreco.Text = produtos.Rows[prodstart]
                .ItemArray[2].ToString();
         txtProdutoQtd.Text = produtos.Rows[prodstart]
                .ItemArray[3].ToString();
         cbbCategoria.Text = categoria.Rows[auxCat]
                .ItemArray[1].ToString();
      }
    
      private void btnAvancar_Click(object sender, EventArgs e)
      {
        prodstart = prodstart + 1;
        PopulateView();
      }
    
      private void btnVoltar_Click(object sender, EventArgs e)
      {
        prodstart = prodstart - 1;
        PopulateView();
      }
    }
    

    【讨论】:

    • 嘿查尔斯,我对 C# 很陌生,但我相信你给我的代码有一些错误,你能检查你的答案吗?另外,我在 GetCategories 和 GetAutos 收到错误,首先是在私有静态 DataTable CategoryDataTable => categoria ? (类别=GetCategories());视觉工作室,说非静态....和私有DataTable GetAutos()或GetCategories()需要对象引用; catch 不返回任何值,而 c# 希望我返回某种类型的数据表。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2012-01-05
    • 2011-10-08
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多