C#SQL连接问题

时间:2010-11-08 12:40:01

标签: c# sql-server visual-studio

我正在使用VS.NET 2008和MS SQL server 2005来开发窗体应用程序,但每次我在连接中或在连接后出现新错误,

在我当前的代码中,连接已打开,但在查询事务中之后无法正常工作。也许我在制作新数据库或新数据源时遇到问题也不满足如何获取连接字符串

这是我的代码......

/////////
private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            //setData();
            string ConnectingString = @"Data Source=SERVER1\SQLEXPRESS;Initial Catalog=Alkawthar;Integrated Security=True;Pooling=False";
            qry = "SELECT * FROM Table1";
            //reader = db.select_data(qry);
            ds1 = new DataSet();
            conn = new SqlConnection(ConnectingString);

            conn.Open(); 
            MessageBox.Show("connection opened");
            da.Fill(ds1,"Workers");
            NavigateRecords();
            MaxRows = ds1.Tables["Workers"].Rows.Count;
            string sql = "SELECT * From tblWorkers";
            da = new System.Data.SqlClient.SqlDataAdapter(sql, conn);
            conn.Close();
            MessageBox.Show("connection closed");
            conn.Dispose();
        }
        catch (Exception ex)
        {
            MessageBox.Show("exception");
            MessageBox.Show(ex.Message);
        }
    }
/////////////////

Fill会抛出异常,当我使用reader时它会返回null,尽管DB中有数据 感谢

3 个答案:

答案 0 :(得分:2)

这里最明显的问题是您在初始化之前访问SqlDataAdapter。这将导致空引用异常。 在执行da = new SqlDataAdapter(...)之前,请尝试将行da.Fill(...)移到该行。

编辑:

不,等等!我看到你在那里做了两个查询和两个填充。在进行第一次填充之前,需要初始化SqlDataAdapter。那么你应该摆脱空引用异常。

再次编辑:

另外,如评论所示,您无需同时调用SqlConnection.CloseSqlConnection.Dispose方法。只要您使用SqlDataAdapter,您甚至不需要在连接上执行SqlConnection.Open,因为Fill方法将为您完成所有这些操作。只要连接开始关闭,Fill方法将在完成后再次关闭它。

答案 1 :(得分:1)

在我看来,您在初始化之前使用了DataAdapter。你有NullReferenceException吗?

da.Fill(ds1,"Workers"); 
// ...
da = new System.Data.SqlClient.SqlDataAdapter(sql, conn); 

答案 2 :(得分:1)

一些建议;

  1. 就像Turrau和Rune所说,你的东西是错误的。打开连接,执行SQL - 获取原始数据,关闭连接。然后做你的计数等。
  2. 不要在连接打开和关闭之间的任何位置放置消息框或记录呼叫。这之前已经烧毁了我,这些调用会影响SQL调用,因为它们会捏造异常细节并使其难以跟踪。这在使用SQL数据读取器时也适用。
  3. 将SQL内容放入using块中。
  4. 试试这个......

        string _connStr = @"Data Source=SERVER1\SQLEXPRESS;Initial Catalog=Alkawthar;Integrated Security=True;Pooling=False";
        string _query = "SELECT * FROM Workers";
        DataSet _ds = new DataSet();
    
        try
        {
    
            using (SqlConnection _conn = new SqlConnection(_connStr))
            {
                SqlDataAdapter _da = new SqlDataAdapter(_query, _conn);
                _conn.Open();
                _da.Fill(_ds);
            }
    
            // insert null dataset or invalid return logic (too many tables, too few columns/rows, etc here.
    
    
            if (_ds.Tables.Count == 1)
            { //There is a table, assign the name to it.
                _ds.Tables[0].TableName = "tblWorkers";
            }
    
            //Then work with your tblWorkers
    
        }
        catch (Exception ex)
        {
            Console.Write("An error occurred: {0}", ex.Message);
        }