我正在尝试使用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);
}
}
}
答案 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);