...是null并且从未分配过,但看起来它已被分配了吗?

时间:2017-07-12 22:01:07

标签: c# class null

我正在尝试使用SQL中的表填充DataGridView(datagridviewCustomers)。下面是我使用DataGridView的表单中的代码,下面是一个连接到数据库的类(SqlHelper.cs),还有我在整个程序中使用的其他函数,所以我不必继续重写代码在每个表格上。

从Data获取数据的DataTable称为dtCustomers1,用作DataGridView的数据源。 MS Visual Studio告诉我dtCustomers1“从未被赋予,并且将始终具有其默认值null。”

然而,

dtCustomers2没有显示此错误并且正常工作,填充DataGridView。 dtCustomers2是另一个像dtCustomers1一样运行的DataTable,尽管它不使用SqlHelper.cs类。

我创建了dtCustomers2来尝试从表单上的SqlHelper.cs中获取代码,看看SqlHelper.cs代码是否有问题,但是当它在同一个表单上时似乎工作正常......

任何人都能明白为什么会这样吗?我在dtCustomers1 / populateCustomersTable()的代码中缺少什么导致永远不会分配这个值?

namespace X.FormName
{
    sqlDBConnect con; //see sqlHelper.cs below for this class
    DataTable dtCustomers1;

    public FormName()
    {
        InitializeComponent();

        populateCustomerTable(); //uses code from sqlHelper.cs 
        getCustomerTable(); //uses only the code from this form
    }

    //using sqlHelper.cs and dtCustomers1
    private void populateCustomerTable()
    {
        con = new sqlDBConnect();
        con.sqlQuery
            (
                "SELECT * FROM dbo.customer"
            );
        con.fetchDT(dtCustomers1);
        datagridviewCustomers.DataSource = dtCustomers1;
    }

    // using only code shown below and dtCustomers2
    private void getCustomerTable()
    {
        SqlConnection con = new SqlConnection(@"DATA CONNECTION STRING");

        DataTable dtCustomers2 = new DataTable();
        SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM dbo.customer", con);
        sda.Fill(dtCustomers2);
        tableCustomers.DataSource = dtCustomers2;

        con.Close();
    }
}

下面是sqlHelper.cs

namespace X
{
    public class sqlDBConnect
    {
        private SqlConnection _con;
        public SqlCommand cmd;
        private SqlDataAdapter _sda;

        public sqlDBConnect()
        {
            _con = new SqlConnection(@"DATA CONNECTION STRING");
            _con.Open();
        }

        public void sqlQuery(string queryText)
        {
            cmd = new SqlCommand(queryText, _con);
        }

        public void fetchDT(DataTable currentDataTable)
        {
            _sda = new SqlDataAdapter(cmd);
            currentDataTable = new DataTable();
            _sda.Fill(currentDataTable);
        }
    }
}

1 个答案:

答案 0 :(得分:-1)

public void fetchDT(DataTable currentDataTable)
{
    _sda = new SqlDataAdapter(cmd);
    currentDataTable = new DataTable();
    _sda.Fill(currentDataTable);
}       

以上代码不正确,问题出在哪里。为了实现这一目标,您需要将currentDataTable作为ref parameter传递(可能不是一个好主意)。修复此问题的一种方法是将此函数重写为

    public DataTable fetchDT()
    {
        _sda = new SqlDataAdapter(cmd);
        var currentDataTable = new DataTable();
        _sda.Fill(currentDataTable);
        return currentDataTable;
    }       

然后像这样调用它:

dtCustomers1 = con.fetchDT();

或...你可以将你的功能改写为

    public void fetchDT(DataTable currentDataTable)
    {
        _sda = new SqlDataAdapter(cmd);
        _sda.Fill(currentDataTable);
    }       

并将其称为:

dtCustomers1 = new DataTable();
con.fetchDT(dtCustomers1);