【问题标题】:Fill datatable in a class, return table to use in another class在一个类中填充数据表,返回表以在另一个类中使用
【发布时间】:2011-12-15 09:12:01
【问题描述】:

好的 标题可能不清楚,所以让我解释一下。 我有 2 个类,“Form1”和“webinfo”。

在“webinfo”中我运行以下代码:

class WebInfo
{
    string myConnVRM = "Data Source = datascource;" +
                          "Initial Catalog = catalog;" +
                          "Persist Security Info=True;" +
                          "User ID=ID;" +
                          "Password=PASS;" +
                          "providerName=System.Data.SqlClient;";
    public WebInfo()
    {

    }

    public void GetVRMs(string vRMs, string start, string end, string acc)
    {
        DataTable vrmTable = new DataTable();
        SqlConnection connVRM = new SqlConnection(myConnVRM);
        connVRM.Open();
        SqlCommand cmdVRM = new SqlCommand("SELECT Ac, Vrm, Make, Model, MamengineSize, date FROM ReturnValue WHERE convert(varchar,[Date],101) between @StartDate and @EndDate and [AC]=@Acct", connVRM);
        cmdVRM.Parameters.AddWithValue("@acct", acc);
        cmdVRM.Parameters.AddWithValue("@from", start);
        cmdVRM.Parameters.AddWithValue("@too", end);
        SqlDataAdapter vrmAdapter = new SqlDataAdapter(cmdVRM);
        vrmAdapter.Fill(vrmTable);

        //bind to data grid and display??
    }
}

如您所见,我连接到服务器,运行查询,最后用结果填充我的表。

然后我的表单类调用 GetVRms 方法,传递相关信息。

但我现在需要做的是将此表绑定到我表单上的数据网格,以便我可以显示。唯一的问题是我如何使用这个类的表?

我是不是想太多了?是不是像 webinfo.vrmtable 一样简单?

提前致谢

【问题讨论】:

  • 顺便说一句,这样做会破坏连接 - 您应该为 connVRMcmdVRM 提供 using 语句,以确保它们被正确处理

标签: c# sql datatable


【解决方案1】:

这真的取决于意图。如果那是一种实用方法,则使其返回数据,即

public DataTable GetVRMs(string vRMs, string start, string end, string acc)
{
    ...
    return vrmTable;
}

并以var data = obj.GetVRMs(...) 访问。

如果表需要保留,那就存放在某处

public DataTable TheTable {get;set;}
public void GetVRMs(string vRMs, string start, string end, string acc)
{
    ...
    TheTable = vrmTable;
}

并访问为:

obj.GetVRMs(..);
var data = obj.TheTable;

注释:

  • GetVRMs 可能被过度缩写了
  • DataTable 有效,但很多人认为类型模型是更好的隐喻
  • 您需要 using 语句等来避免问题(最明显的是:连接池饱和)

【讨论】:

    【解决方案2】:

    您的 SQL 在这里似乎也有问题。

       SqlCommand cmdVRM = new SqlCommand("SELECT Ac, Vrm, Make, Model, MamengineSize, date FROM ReturnValue WHERE convert(varchar,[Date],101) between @StartDate and @EndDate and [AC]=@Acct", connVRM);
            cmdVRM.Parameters.AddWithValue("@acct", acc);
            cmdVRM.Parameters.AddWithValue("@StartDate", start);
            cmdVRM.Parameters.AddWithValue("@EndDate", end);
    

        string SQL = "SELECT Ac, Vrm, Make, Model, MamengineSize, date FROM ReturnValue WHERE convert(datetime,[Date],101) between '"+ start +"' and '"+ end +"' and [AC]=" + acc+ "; ";
              SqlCommand cmdVRM = new SqlCommand(SQL, connVRM);
    

    现在您可以按照自己喜欢的方式使用它了。

    // As DataTable is ref
    public void GetVRMs(string vRMs, string start, string end, string acc, DataTable dtVM)
    {
    if(dtVM == null) throw new Exception("Message");
       ......
    }
    

    public DataTable GetVRMs(string vRMs, string start, string end, string acc)
    {
      DataTable dtVM=new DataTable();
      .......
    
      Return dtVM;
    }
    

    【讨论】:

      【解决方案3】:

      改变

          public void GetVRMs(string vRMs, string start, string end, string acc)
      

          public DataTable GetVRMs(string vRMs, string start, string end, string acc)
      

      然后放

          return vrmTable;
      

      在方法结束时。

      然后像这样绑定到 UI 中的表格:

          WebInfo wi = new WebInfo();
          DataTable dt = wi.GetVRMs(....);
          myDataGridView.DataSource = dt;
          myDataGridView.DataBind();
      

      【讨论】:

      • 我不知道为什么我没有为表创建一个返回类型.....认为它今天我的大脑失败了。非常感谢!
      【解决方案4】:

      定义一个公共属性 vrmtable 并使用 WebInfo 类的对象从任何地方访问它。

      class WebInfo
      {
          public DataTable vrmTable{get;} 
      
          string myConnVRM = "Data Source = datascource;" +
                                "Initial Catalog = catalog;" +
                                "Persist Security Info=True;" +
                                "User ID=ID;" +
                                "Password=PASS;" +
                                "providerName=System.Data.SqlClient;";
          public WebInfo()
          {
      
          }
      
          public void GetVRMs(string vRMs, string start, string end, string acc)
          {
              SqlConnection connVRM = new SqlConnection(myConnVRM);
              vrmTable == new DataTable();
              connVRM.Open();
              SqlCommand cmdVRM = new SqlCommand("SELECT Ac, Vrm, Make, Model, MamengineSize, date FROM ReturnValue WHERE convert(varchar,[Date],101) between @StartDate and @EndDate and [AC]=@Acct", connVRM);
              cmdVRM.Parameters.AddWithValue("@acct", acc);
              cmdVRM.Parameters.AddWithValue("@from", start);
              cmdVRM.Parameters.AddWithValue("@too", end);
              SqlDataAdapter vrmAdapter = new SqlDataAdapter(cmdVRM);
              vrmAdapter.Fill(vrmTable);
      
              //bind to data grid and display??
          }
      }
      

      【讨论】:

        【解决方案5】:

        为什么不直接返回 DataTable 呢?

        public DataTable GetVRMs(string vRMs, string start, string end, string acc) 
        {        
            [...]
            return vrmTable;
        }
        

        【讨论】:

          【解决方案6】:

          您可以使用DataTable 的返回类型作为void 而不是GetVRMs 方法返回表,即vrmTable,然后将其分配给数据网格的数据源

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-30
            • 2013-08-02
            • 2022-01-27
            • 2014-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多