Использование нескольких читателей данных

Я разрабатываю Приложение WinForm в до-диезе на структуре .NET. Последовательность базы данных, которую я использую на данный момент,

<add key="Conn" value="Data Source=MNTCON016; Database=Overtime_Calculator;Trusted_Connection=True;MultipleActiveResultSets=true" />

Поскольку я использую Microsoft SQL Server 2005 для развития, я могу использовать 2 читателей данных, одновременно использующих собственность MultipleActiveResultSets для истинного, как упомянуто выше.

Метод, используемый, чтобы призвать 2 читателей данных, следующие:

    public static void SignUpControllerDay(DateTime Date, System.Windows.Forms.DataGridView PassedGrid)
    {
        string sql_SignUp = String.Format(@"SELECT Emp_ID as Emp_ID, Name as Name, Sum(Sum) as Sum FROM
                                            (SELECT DISTINCT o.Date, e.Emp_ID as Emp_ID,
                                            e.First_Name+ ' ' +e.Last_Name as Name,
                                            o.Quantity as Sum
                                            FROM Employee e,OT_Hours o,Position p,Signup_Sheet s
                                            WHERE e.Emp_ID=o.Emp_ID
                                            and e.Emp_ID = s.Employee_ID
                                            and s.Day_Shift = 1
                                            and e.Position_ID = p.Position_ID
                                            and p.Position_Name = 'Controller'
                                            and o.Quantity NOT IN(0.3)
                                            and s.Date = '{0}'
                                            and o.Date <= CONVERT(VARCHAR,'{0}',101) AND o.Date > CONVERT(VARCHAR,DATEADD(YYYY,-1,'{0}'),101) )
                                            as OVERTIME
                                            GROUP BY Emp_ID,Name
                                            ORDER BY Sum", Date);

        SqlConnection sqlConn = null;
        SqlCommand cmd_SignUp;
        SqlDataReader dr_SignUp;
        try
        {
            sqlConn = new SqlConnection(databaseConnectionString);
            sqlConn.Open();
            cmd_SignUp = new SqlCommand(sql_SignUp, sqlConn);
            dr_SignUp = cmd_SignUp.ExecuteReader();

            while (dr_SignUp.Read())
            {
                ArrayList arrPhone = new ArrayList();
                string sql_Phone = String.Format("SELECT Phone_Number FROM Contact_Details WHERE Emp_ID = {0}", dr_SignUp["Emp_ID"]);
                SqlCommand cmd_Phone = new SqlCommand(sql_Phone, sqlConn);
                SqlDataReader dr_Phone = cmd_Phone.ExecuteReader();
                while (dr_Phone.Read())
                {
                    arrPhone.Add(dr_Phone["Phone_Number"].ToString());
                }
                //--Retrieving Sectors
                ArrayList arrSector = new ArrayList();
                string sql_Sector = String.Format(@"SELECT e1.EMP_ID,
                                                ( SELECT cast(Sector_ID as varchar(10)) + ';'
                                                FROM Employee_Sector_relationship e2
                                                WHERE e2.Emp_ID = e1.Emp_ID
                                                ORDER BY Sector_ID
                                                FOR XML PATH('') ) AS Sectors
                                                FROM Employee_Sector_Relationship e1
                                                WHERE Emp_ID = {0}
                                                GROUP BY Emp_ID ", dr_SignUp["Emp_ID"]);
                SqlCommand cmd_Sector = new SqlCommand(sql_Sector, sqlConn);
                SqlDataReader dr_Sector = cmd_Sector.ExecuteReader();
                while (dr_Sector.Read())
                {
                    arrSector.Add(dr_Sector["Sectors"].ToString());
                }
                if (arrSector.Count == 0)
                { arrSector.Add(" "); }
                if (arrPhone.Count == 0)
                { arrPhone.Add(" "); }
                //--
                if (arrPhone.Count == 2)
                {
                    PassedGrid.Rows.Add(dr_SignUp["Emp_ID"].ToString(), dr_SignUp["Name"].ToString(), arrSector[0], dr_SignUp["Sum"], arrPhone[0], arrPhone[1]);
                }

                else
                {
                    PassedGrid.Rows.Add(dr_SignUp["Emp_ID"].ToString(), dr_SignUp["Name"].ToString(), arrSector[0], dr_SignUp["Sum"], arrPhone[0]);
                }
            }

        }
        catch (Exception e)
        {
            MessageBox.Show("Error found in SignUpControllerDay..." + Environment.NewLine + e.ToString());
        }
        finally
        {
            if (sqlConn != null)
            {
                sqlConn.Close();
            }
        }
    }

Все хорошо работает. Теперь настоящая проблема. Мне сообщили, что производственным SQL-сервером для заявления пойти живой является Microsoft SQL server 2000. После проведения небольшого исследования я узнал тот сервер Microsoft, 2000 не поддерживает несколько активных наборов результатов propery. Короче говоря, это не позволяет мне использовать 2 читателей данных одновременно.

Я должен знать, как прочитать данные из 2 различных столов, одновременно, относительно SQL-сервера 2000.

Есть ли любые другие способы, которыми я могу прочитать данные, как я упомянул в кодексе..

Пожалуйста, помогите.. применение почти сделано и готово пойти в производство. но сервер MS 2000 не позволяет applcaition работать соответственно...

пожалуйста, помогите

10
задан Joel Coehoorn 13 January 2010 в 14:59
поделиться

3 ответа

Вы можете иметь две активные ресурсы на SQL Server 2000, просто создавая два соединения.

Чтобы продемонстрировать это, я должен сначала рассердить вас за использование двух очень плохих практик: динамический SQL и Arraylists. Ни одно место в вашем коде. Вы также должны читать постройку, хотя у вас есть мои извинения и соболезнования на «Использование» и «ArrayLists», если вы все еще используете .NET 1.1.

, который сказал, вот как код должен выглядеть:

string sql_Phone = "SELECT Phone_Number FROM Contact_Details WHERE Emp_ID = @EmpID";
using (SqlConnection cn2 = new Sqlconnection(databaseConnectionString))
using (SqlCommand cmd_Phone = new SqlCommand(sql_Phone, cn2))
{
    cmd_Phone.Parameters.Add("@EmpID", SqlDbType.Int);
    cn2.Open();

    while (dr_SignUp.Read())
    {
        List<string> arrPhone = new List<string>();
        cmd_Phone.Parameters[0].Value = dr_SignUp["Emp_ID"];

        using (SqlDataReader dr_Phone = cmd_Phone.ExecuteReader())
        {
            while (dr_Phone.Read())
            {
                arrPhone.Add(dr_Phone["Phone_Number"].ToString());
            }
        }

также, глядя на ваш код, я подозреваю, что вы На самом деле необходимо сделать, это повторно написать свой SQL. Вы можете объединить все в одном запросе, который вы просто связываете непосредственно к сетке.

15
ответ дан 3 December 2019 в 21:59
поделиться

Конечно:

public void SignUpControllerDay()
{
    using (var conn = new SqlConnection(ConnectionString))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "SELECT ...";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                var phone = reader["Phone_Number"].ToString();
                Bar(phone);
            }
        }
    }
}

public void Bar(string phone)
{
    using (var conn = new SqlConnection(ConnectionString))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "SELECT ..."; // use phone to prepare statement
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // Fill the grid
            }
        }
    }
}
4
ответ дан 3 December 2019 в 21:59
поделиться

Вы можете открыть несколько подключений к базе данных с 1 считывателем на соединение

1
ответ дан 3 December 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: