我有以下代码:
表格中:
public void filterType_TextChanged(object sender, EventArgs e)
{
var dSearch = new D_Search(this);
dSearch.filterD(sender);
}
所以我有一个Textbox事件,我在另一个类dSearch中调用filterD函数。在dSearch课程中我有:
public D_Search(Form1 frm1)
{
form1 = frm1;
}
public String filterD(object sender)
{
string val = String.Empty;
if (sender == form1.filterType())
{
val = (sender as TextBox).Text;
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
}
datTable = new DataTable();
sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText,
connection); //causes NullReferenceException
sqlDatAdapter.Fill(datTable);
form1.setDataGrid = datTable;
return val;
}
所以我的表单中有多个函数,比如filterType,它们是Textbox事件。现在我想将它们传递给我的Class,它应该注意if语句调用了什么事件(Textbox被更改了)但是我在sqlDatAdapter处获得了NullReference异常。我该怎么办?
编辑:这是空的cmd。此外:
这是filterType函数:
public String filterType()
{
return filterTypeNumber.Text;
}
EDIT2:未使用if语句,因此他无法识别发件人,因为他会比较发件人是否为文本框条目。我该怎么办?
答案 0 :(得分:1)
所以将你的IF语句改为;
if ( (sender as TextBox).Text== form1.filterType())
{
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
}
还要确保连接已打开。
希望它有所帮助...... !!!
答案 1 :(得分:0)
您没有打开连接
Con.OPen();
//logic here
cmd.ExecuteNonQuery();
Con.Close();
//数据驻留在sqlCmd对象
中sqlCmd = new SqlCommand("SELECT * FROM, connection);
尝试将sqlCmd作为参数传递
sqlDatAdapter = new SqlDataAdapter(sqlCmd,connection);
答案 2 :(得分:0)
确保您已实例化connection
,因此它不为空。假设这不是你的问题,在我看来你可能会从sqlCmd
获得NullRefEx,当(sender == form1.filterType())
为false时可能无法实例化。如果是这样,你应该能够通过稍微改变一下来解决它,例如:
// Make the table available outside the if-else, even if it is empty:
datTable = new DataTable();
if (sender == form1.filterType())
{
val = (sender as TextBox).Text;
//havent written the whole SQL Command here
sqlCmd = new SqlCommand("SELECT * FROM, connection);
// Only do this if it is relevant, i.e. here within the if-structure,
// that way, you should be able to avoid the nullRef:
sqlDatAdapter = new SqlDataAdapter(sqlCmd.CommandText, connection);
sqlDatAdapter.Fill(datTable);
}
// You might have to check something extra here, depending on
// usage, since the table might be empty:
form1.setDataGrid = datTable;
回复评论时更新:
我不确定我是否会关注您,但如果您想再次移出sqlCmd,那很好 - 只要确保它不为空,即使sender == form1.filterType()
为false。如果在实例化sqlCmd.CommandText
之前还有其他内容填充SqlDataAdapter
,请确保先执行此操作。否则,您可能会执行以下操作,并将所有这些放在另一个if
- 结构之外:
if(sqlCmd != null && !String.IsNullOrEmpty(sqlCmd.CommandText)){
sqlDatAdapter = new SqlDataAdapter(...)
...
}
无论哪种方式,您都必须通过以下两种方式之一来避免空引用:填充sqlCmd
,因此它不为空,或者避免调用它。