C#应用程序首先远程连接到SQL Server两次,但崩溃了第三次

时间:2015-03-12 10:06:16

标签: c# sql sql-server sql-server-express

我有一个SQL类,可以读取和写入远程SQL Server数据库的数据。当我启动应用程序时,它连接并读取2个表但是一旦它尝试读取第3个表,应用程序就会抛出异常:

  

发生与网络相关的实例或特定于实例的错误   建立与SQL Server的连接。找不到服务器或   无法访问。验证实例名称是否正确   SQL Server配置为允许远程连接。

我的连接字符串如下所示:

server=My-PC\SQLEXPRESS;database=DB_main; User Id=**;password=*****; Integrated Security=SSPI;

读取前两个表时连接字符串正常工作,但在读取第三个表时崩溃。

我的SQL类包含一个函数,用于检索保存到文本文件的连接字符串。然后对于每个表我都有一个连接到数据库并读取所有行的函数,并将其作为强类型List<T>

返回

示例:

public List<User> ReadAll_Users()
{
    string Table_Name = "Table_Users";

    sqlCommand2 = new SqlCommand();
    List<User> ListUsers = new List<User>();
    try
    {
        string path = GetPathOfDataBAse2();
        sqlconnection2 = new SqlConnection(path);
        sqlCommand2.Connection = sqlconnection2;
        sqlCommand2.CommandText = "Select * from " + Table_Name;

        sqlconnection2.Open();
        SqlDataReader reader = sqlCommand2.ExecuteReader();

        while (reader.Read())
        {
            User model = new User();

            model.Name = Convert.ToString(reader["Name"]).ToString();
            model.Surname = Convert.ToString(reader["Surname"]).ToString();
            model.Created_Date =    Convert.ToString(reader["Created_Date"]).ToString();
            model.Password = Convert.ToString(reader["Password"]).ToString();

            model.Admin = Convert.ToString(reader["Admin"]).ToString();

            ListUsers.Add(User);
        }
        sqlconnection2.Close();

        return (ListUsers);
    }
    catch (Exception ex)
    {
        ErrorReport msg = new ErrorReport("SQLconnector,  ReadAll_Users()", ex.ToString());
        msg.ShowDialog();
        sqlconnection2.Close();
        return (null);
    }
}

所有功能都采用相同的技术。

我可以看一下解决这个问题的方法吗?

3 个答案:

答案 0 :(得分:0)

我认为你需要关闭你的读者。

答案 1 :(得分:0)

我想你应该在你的代码中处理所有与SQL相关的对象(现在你可能在调用方法后有非处理的SqlCommand和SqlDataReader)。您可以在SqlConnection,SqlCommand,SqlDataReader对象上显式调用Dispose()(最好在finally块中执行它,而不是在try和catch块中编写代码两次)。

但是使用“using”语句会更好。它的工作方式相同(如在finally块中处理对象),但您需要更少的输入。例如,代码可能如下所示:

public List<User> ReadAll_Users_st()
    {
        string Table_Name = "Table_Users";
        string path = GetPathOfDataBAse2();
        List<User> ListUsers = new List<User>();

        using (SqlConnection sqlconnection2 = new SqlConnection(path))
        using (SqlCommand sqlCommand2 = sqlconnection2.CreateCommand())
        {
            try
            {
                sqlCommand2.CommandText = "Select * from " + Table_Name;
                sqlconnection2.Open();
                using (SqlDataReader reader = sqlCommand2.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        User model = new User();

                        model.Name = Convert.ToString(reader["Name"]).ToString();
                        model.Surname = Convert.ToString(reader["Surname"]).ToString();
                        model.Created_Date = Convert.ToString(reader["Created_Date"]).ToString();
                        model.Password = Convert.ToString(reader["Password"]).ToString();

                        model.Admin = Convert.ToString(reader["Admin"]).ToString();

                        ListUsers.Add(model);
                    }
                }
                sqlconnection2.Close();
                return (ListUsers);
            }
            catch (Exception ex)
            {
                ErrorReport msg = new ErrorReport("SQLconnector,  ReadAll_Users()", ex.ToString());
                msg.ShowDialog();
                sqlconnection2.Close();
                return (null);
            }
        }
    }

答案 2 :(得分:0)

感谢您的评论,我应该提供比我更多的信息,我道歉。我发现了错误。当我启动项目时,我使用SQL compact我忽略了一些关于SQL服务器更改的代码。错误发生在

`sqlconnection2 = new SqlConnection(path);`  

在某些时候我应该改变每一个

`sqlconnection2 = new SqlConnection("Data Source = " + path + ";");`

`sqlconnection2 = new SqlConnection(path);`