将字符数组与数据库记录进行比较并读取记录
问题描述:
我试图将数据库从MySQL更改为针对此VS2010 C#项目的SQL Server 2008 express。但是,当我更改连接字符串和查询后,程序会在“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();
}
}
我试图产生收到字符串将被分解成焦炭然后与数据库中值的程序。之后,程序将从数据库中输出一串值。
答
由于您将其定义为;
SqlDataReader cmr;
默认情况下它会是null
。这就是为什么当你尝试打电话时你得到NullReferenceException
;
cmr.Close();
因为你永远不会初始化你的阅读器。对于这种情况,您不需要使用ExecuteNonQuery
。只需使用ExecuteReader
方法生成您的cmr
即可;
cmd = new SqlCommand ("select JawiReader (stringR)" + ((char)obj), sc);
cmr = cmd.ExecuteReader();
请使用using
statement配置您的连接,命令和阅读器。
答
你永远不会初始化SQLDataReader cmr;
因此,当然你会得到一个错误,当你想关闭它。
您无法关闭根本没有创建的对象。
[我要关闭我的城堡的大门,但unfortuntaley,这座城堡只存在于我的梦想...]
的[可能重复什么是一个NullReferenceException,如何解决? ](http://*.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – dotctor
if(cmr!= null)cmr.Close();不需要打开和关闭每个命令的连接。将连接“sc”在foreach循环之外打开/关闭。 – jdweng