2015-06-14 104 views
0

我试图将数据库从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(); 
      } 
     } 

我试图产生收到字符串将被分解成焦炭然后与数据库中值的程序。之后,程序将从数据库中输出一串值。

+1

的[可能重复什么是一个NullReferenceException,如何解决? ](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – dotctor

+0

if(cmr!= null)cmr.Close();不需要打开和关闭每个命令的连接。将连接“sc”在foreach循环之外打开/关闭。 – jdweng

回答

2

由于您将其定义为;

SqlDataReader cmr; 

默认情况下它会是null。这就是为什么当你尝试打电话时你得到NullReferenceException;

cmr.Close(); 

因为你永远不会初始化你的阅读器。对于这种情况,您不需要使用ExecuteNonQuery。只需使用ExecuteReader方法生成您的cmr即可;

cmd = new SqlCommand ("select JawiReader (stringR)" + ((char)obj), sc); 
cmr = cmd.ExecuteReader(); 

请使用using statement配置您的连接,命令和阅读器。

+0

感谢您的帮助。现在错误消失了,但程序仍然有另一个错误,即“在期望条件的上下文中指定的非布尔类型的表达式”, – jenan

+0

@jenan确定您的查询是正确的?你在管理工作室尝试过吗? –

+0

嗨,很抱歉地再问你一个问题,但我已经达到了提问的极限。我在标签上显示sql内容时遇到了问题。它假设显示一个字符数组,到目前为止,我得到了一个警告提示“最后一个字符上的无效列名”,你知道最新的问题是什么吗? – jenan

0

你永远不会初始化SQLDataReader cmr;

因此,当然你会得到一个错误,当你想关闭它。

您无法关闭根本没有创建的对象。

[我要关闭我的城堡的大门,但unfortuntaley,这座城堡只存在于我的梦想...]

相关问题