System.Net.Sockets.SocketException: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。

Tube_Z 2015-02-05 09:57:32
[SocketException (0x2747): 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。]
System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) +5327494
System.Net.Sockets.Socket.InternalBind(EndPoint localEP) +99
System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state) +207
System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state) +125
MySql.Data.Common.StreamCreator.CreateSocketStream(IPAddress ip, Boolean unix) +168
MySql.Data.Common.StreamCreator.GetStream(UInt32 timeout) +389
MySql.Data.MySqlClient.NativeDriver.Open() +219


有人说是我ExecuteReader方法 没有关闭.


public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
MySqlCommand cmd = new MySqlCommand();
MySqlConnection conn = new MySqlConnection(connString);
MySqlDataReader rdr = null;
try
{
rdr.Close(); //在这个地方已经关闭了. 为什么过一段时间还是出现相同的错误. 不理解啊.
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch
{
conn.Close();
throw;
}
}
...全文
945 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-02-05
  • 打赏
  • 举报
回复
如果你们领导告诉你,出入要随手关门,不要浪费空调电量 然后你在每个人进出之前把门关好,人家把门打开出去了,你反而不管?
於黾 2015-02-05
  • 打赏
  • 举报
回复
先执行cmd.ExecuteReader 后执行close 话说,你真的懂编程吗
江南小鱼 2015-02-05
  • 打赏
  • 举报
回复
引用 楼主 Tube_Z 的回复:
[SocketException (0x2747): 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。] System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) +5327494 System.Net.Sockets.Socket.InternalBind(EndPoint localEP) +99 System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state) +207 System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state) +125 MySql.Data.Common.StreamCreator.CreateSocketStream(IPAddress ip, Boolean unix) +168 MySql.Data.Common.StreamCreator.GetStream(UInt32 timeout) +389 MySql.Data.MySqlClient.NativeDriver.Open() +219 有人说是我ExecuteReader方法 没有关闭.

public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
        {
            MySqlCommand cmd = new MySqlCommand();
            MySqlConnection conn = new MySqlConnection(connString);
            MySqlDataReader rdr = null;    
            try
            {
                rdr.Close();   //在这个地方已经关闭了.   为什么过一段时间还是出现相同的错误. 不理解啊.
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
        }
靠 你的MySqlDataReader rdr = null; 是null,你rdr.Close(); 你闹呢
Tube_Z 2015-02-05
  • 打赏
  • 举报
回复
这是我的整个类. 求解应该怎么释放啊.

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using MySql.Data.MySqlClient;
using System.Data;
using System.Configuration;
namespace V5Shop.Data
{
    public class MySqlDBHelp
    {
        private static MySqlConnection _connection;
        /// <summary>
        /// 获取数据库连接桥
        /// </summary>
        private static MySqlConnection Connection
        {
            get
            {
                string connectionString = ConfigurationManager.AppSettings["MYSQLConnString"];
                //string connectionString = "Server=localhost;Database=test;Uid=root;Pwd=123456;CharSet=utf8;";
                
                //string connectionString = "Server=125.88.186.112;port=3306;Database=drug;Uid=drug;Pwd=drug234..LZS!!;CharSet=utf8;";


                //string connectionString = "Data Source=202.192.72.22;Initial Catalog=wwj;Persist Security Info=True;User ID=wwj;Password=wwj123";
                if (_connection == null)
                {
                    _connection = new MySqlConnection(connectionString);
                    _connection.Open();
                }
                if (_connection.State == ConnectionState.Closed)
                {
                    _connection.Open();
                }
                if (_connection.State == ConnectionState.Broken)
                {
                    _connection.Close();
                    _connection.Open();
                }
                return _connection;
            }

        }

        #region 数据获取和执行类
        /// <summary>
        /// 获取表数据
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static MySqlDataReader GetDataRead(string sql)
        {
            MySqlCommand command = new MySqlCommand(sql, Connection);
            MySqlDataReader read = null;
            read.Close();
            read = command.ExecuteReader();

            return read;
        }
        public static int ExecuteNonQuery(string sql)
        {
            MySqlCommand command = new MySqlCommand(sql, Connection);
            int row = command.ExecuteNonQuery();
            return row;
        }
        //public static DataTable ExecuteDataTable(string sql)
        //{

        //    MySqlCommand command = new MySqlCommand(sql, Connection);

        //    DataTable dt = new DataTable();
        //    try
        //    {
        //        MySqlDataAdapter sda = new MySqlDataAdapter(command);
        //        sda.Fill(dt);
        //    }
        //    catch (Exception)
        //    {

        //        throw;
        //    }

        //    return dt;
        //}


        public static DataTable ExecuteDataTable(string sql)
        {
            string connString = ConfigurationManager.AppSettings["MYSQLConnString"];
            DataSet ds = ExecuteDataSet(connString,CommandType.Text,sql);
            return ds.Tables[0];
        }

        /// <summary>
        /// 执行sql语句,返回一行一列。。
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <returns></returns>
        public static string GetScalar(string sql)
        {
            MySqlCommand command = new MySqlCommand(sql, Connection);
            return command.ExecuteScalar().ToString();
        }

        #endregion


        #region 事务操作
        /// <summary>
        /// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
        /// </summary>
        /// <param name="connectionString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="commandType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="commandText">SQL语句或存储过程</param>
        /// <param name="commandParameters">SqlParameter[]参数数组</param>
        /// <returns>SqlDataReader:执行结果的记录集</returns>
        public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
        {
            MySqlCommand cmd = new MySqlCommand();
            MySqlConnection conn = new MySqlConnection(connString);
            MySqlDataReader rdr = null;
            // 我们在这里用 try/catch 是因为如果这个方法抛出异常,我们目的是关闭数据库连接,再抛出异常,
            // 因为这时不会有DataReader存在,此后commandBehaviour.CloseConnection将不会工作。
            try
            {
                rdr.Close();
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
        }

        /// <summary>
        /// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
        /// </summary>
        /// <param name="connectionString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="commandType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="commandText">SQL语句或存储过程</param>
        /// <returns>SqlDataReader:执行结果的记录集</returns>
        public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText)
        {
            return ExecuteReader(connString, cmdType, cmdText, (MySqlParameter[])null);
        }

        /// <summary>
        /// 用提供的方法,执行带参数的SQL命令,返回值为该命令所影响的行数
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <param name="cmdParameters">SQL语句所带的参数集</param>
        /// <returns>int:该命令所影响的行数</returns>
        public static int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParameters)
        {

            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection conn = new MySqlConnection(connString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }


        /// <summary>
        /// 用提供的方法,执行SQL命令,返回值为该命令所影响的行数
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <returns>int:该命令所影响的行数</returns>
        public static int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText)
        {
            return ExecuteNonQuery(connString, cmdType, cmdText, (MySqlParameter[])null);
        }


        /// <summary>
        /// 用提供的方法,执行带参数的SQL命令,返回值为结果集中第一行的第一列或空引用(如果结果集为空)。
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <param name="cmdParameters">SQL语句所带的参数集</param>
        /// <returns></returns>
        public static string ExecuteScalar(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParameters)
        {
            MySqlCommand cmd = new MySqlCommand();
            using (MySqlConnection conn = new MySqlConnection(connString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
                return cmd.ExecuteScalar().ToString();
            }

        }


        /// <summary>
        /// 用提供的方法,执行SQL命令,返回值为结果集中第一行的第一列或空引用(如果结果集为空)。
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <returns></returns>
        public static string ExecuteScalar(string connString, CommandType cmdType, string cmdText)
        {
            return ExecuteScalar(connString, cmdType, cmdText, (MySqlParameter[])null);
        }

        public static DataSet ExecuteDataSet(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParameters)
        {
            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection conn = new MySqlConnection(connString))
            {

                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
                MySqlDataAdapter ada = new MySqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                ada.Fill(ds);
                cmd.Parameters.Clear();
                return ds;
            }
        }

        public static DataSet ExecuteDataSet(string connString, CommandType cmdType, string cmdText)
        {
            return ExecuteDataSet(connString, cmdType, cmdText, (MySqlParameter[])null);
        }
        public static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (MySqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }
        #endregion
    }
}

Tube_Z 2015-02-05
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
要么你哪里调用的,哪里close 或者不要返回MySqlDataReader,而是返回dataset
这样写应该没问题了吧

public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
        {
            MySqlCommand cmd = new MySqlCommand();
            MySqlConnection conn = new MySqlConnection(connString);
            // 我们在这里用 try/catch 是因为如果这个方法抛出异常,我们目的是关闭数据库连接,再抛出异常,
            // 因为这时不会有DataReader存在,此后commandBehaviour.CloseConnection将不会工作。
            try
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                using (MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { 
                    cmd.Parameters.Clear();
                    return rdr;
                }
            }
            catch
            {
                conn.Close();
                throw;
            }
        }
於黾 2015-02-05
  • 打赏
  • 举报
回复
要么你哪里调用的,哪里close 或者不要返回MySqlDataReader,而是返回dataset
Tube_Z 2015-02-05
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
如果你们领导告诉你,出入要随手关门,不要浪费空调电量 然后你在每个人进出之前把门关好,人家把门打开出去了,你反而不管?
cmd.ExecuteReader我执行完这个后. 在执行close.. 那返回的不是一个关闭的 MySqlDataReader了?

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧