Conn.Open () все еще работает после остановки службы SQL - PullRequest
1 голос
/ 16 ноября 2010

Я столкнулся с проблемой в SQL Server 2005 с пакетом обновления 2 (SP2), создал форму Windows и с кнопкой на ней, выполнив следующие действия:

  1. Убедитесь, что служба Sql запущена, затемнажмите кнопку, все в порядке
  2. Остановите службу Sql, а затем нажмите кнопку еще раз, на моей машине нет исключения в коде LINE 1 , исключение произошло в LINE 2 , и это информация об исключении:

Сообщение: при отправке запроса на сервер произошла ошибка транспортного уровня.(поставщик: поставщик общей памяти, ошибка: 0 - на другом конце канала нет процесса.)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace ReconnectSQL
{
    public partial class Form1 : Form
    {

        private string m_ConnectionString = @"Server=(local); Database=testDB; User ID=sa; Password=admins; Connection Timeout=15";

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 
        /// </summary>
        public DataTable GetByFillDataTable()
        {
            try
            {
                SqlCommand cmd = new SqlCommand("getalldata");
                cmd.CommandType = CommandType.StoredProcedure;

                DataTable dt = this.GetDataTable(cmd);
                return dt;
            }
            catch
            {
                throw;
            }
        }


        #region common funcs
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cmd"></param>
        /// <returns></returns>
        private DataTable GetDataTable(SqlCommand cmd)
        {
            DataTable dt = new DataTable();

            using (SqlConnection conn = new SqlConnection(this.m_ConnectionString))
            {
                try
                {
                    conn.Open();  // LINE 1
                }
                catch (Exception eX)
                {
                    throw;
                }

                using (SqlDataAdapter adapter = new SqlDataAdapter())
                {
                    try
                    {
                        cmd.Connection = conn;
                        cmd.CommandTimeout = conn.ConnectionTimeout;
                        adapter.SelectCommand = cmd;
                        adapter.Fill(dt);  // LINE 2
                    }
                    catch (Exception eX)
                    {
                        throw;
                    }
                }
            }

            return dt;
        }

        #endregion       

        private void button2_Click(object sender, EventArgs e)
        {

            try
            {
                DataTable dt = GetByFillDataTable();
                listBox1.Items.Add("GetByFillDataTable is called without exceptions!");
            }
            catch (Exception ex)
            {
                listBox1.Items.Add(ex.Message);
            }            }
    }
}

Подробная информация об исключении:

-       [System.Data.SqlClient.SqlException]    {"A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)"} System.Data.SqlClient.SqlException
+       base    {"A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)"} System.Data.Common.DbException {System.Data.SqlClient.SqlException}
        Class   20  byte
+       Errors  {System.Data.SqlClient.SqlErrorCollection}  System.Data.SqlClient.SqlErrorCollection
        LineNumber  0   int
        Number  233 int
        Procedure   null    string
        Server  "(local)"   string
        Source  ".Net SqlClient Data Provider"  string
        State   0   byte

StackTrace

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.WriteSni()
   at System.Data.SqlClient.TdsParserStateObject.WritePacket(Byte flushMode)
   at System.Data.SqlClient.TdsParserStateObject.ExecuteFlush()
   at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at ReconnectSQL.Form1.GetDataTable(SqlCommand cmd) in E:\_public_\sqlFail\ReconnectSQL\ReconnectSQL\Form1.cs:line 138

1 Ответ

1 голос
/ 26 ноября 2010

После некоторых исследований кажется, что соединение все еще существует в пуле соединений, даже если sql остановлен, поэтому после запуска sql и вызова conn.Open () он получает объект соединения из пула, который должен быть недействительным, затемSqlDataAdapter.Fill вызвать исключение

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/99963999-a59b-4614-a1b9-869c6dff921e

...