我尝试将数据库从MySQL更改为SQL Server 2008 Express for VS2010 C#项目。但是,在我更改连接字符串和查询后,程序产生错误'空引用异常未处理'在" cmr.close()"。以下是代码和发生错误的位置:
namespace JawiRdrSQL
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
SqlConnection sc = new SqlConnection("Data Source=USER-PC\\SQLEXPRESS;Initial Catalog=firstDB;Integrated Security=True");
SqlCommand cmd;
SqlDataReader cmr;
public MainWindow()
{
InitializeComponent();
}
//string sc;
string strValue;
private void button1_Click(object sender, RoutedEventArgs e)
{
strValue = textBox1.Text;
char[] strVal = strValue.ToCharArray();
Array.Reverse(strVal);
foreach(char obj in strVal)
{
try
{
sc.Open();
cmd = new SqlCommand ("select JawiReader (stringR)" + ((char)obj), sc);
cmd.ExecuteNonQuery();
if (cmr.Read())
{
label1.Content += cmr["stringJ"].ToString();
}
else
{
MessageBox.Show("tidak sah");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
cmr.Close(); // error occurs here
sc.Close();
}
}
我正在尝试生成一个接收字符串的程序,该字符串将被分解为char,然后与数据库中的值进行比较。之后程序将从数据库中输出一串值。
答案 0 :(得分:2)
因为你将其定义为;
SqlDataReader cmr;
默认情况下为null
。这就是你试图打电话时NullReferenceException
的原因;
cmr.Close();
因为您从不初始化您的读者。在这种情况下,您不需要使用ExecuteNonQuery
。只需使用cmr
方法生成ExecuteReader
,如<; p>
cmd = new SqlCommand ("select JawiReader (stringR)" + ((char)obj), sc);
cmr = cmd.ExecuteReader();
请使用using
statement处理您的连接,命令和读者。
答案 1 :(得分:0)
您永远不会初始化False
因此,当您想要关闭它时,当然会出现错误。
您无法关闭尚未创建的对象。
[我想关闭我城堡的门,但不幸的是,这座城堡只存在于我的梦中...]