用这个类访问mysql,多刷新查询几次就连不上mysql数据库服务器了,必须IIS重启或回收应用程序池才能连上。
有没有好的解决方案?
微软对Oracel,sql server等数据库支持相当的好,是对mysql支持不好吗?
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using System.IO;namespace Maticsoft.DBUtility
{
public class MySqlHelper
{
private MySqlConnection myConnection;
private MySqlCommand myCommand;
private MySqlDataAdapter myAdapter;
private MySqlTransaction myTransaction; public MySqlHelper()
{
getConnection();
} //建立DB连接
public void getConnection()
{
//StreamReader din = File.OpenText("TextFile.ini");
//string contString = din.ReadLine();
string contString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringMySql"].ConnectionString; try
{
myConnection = new MySqlConnection();
myConnection.ConnectionString = contString;
myConnection.Open(); }
catch (Exception ex)
{
//Console.WriteLine(ex);
throw new Exception("连接失败!");
}
}
private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
{ if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = cmdText; cmd.CommandType = cmdType; if (cmdParms != null)
{
foreach (MySqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
} private static MySqlCommand buildQueryCommand(MySqlConnection connection, string storedProcName,
IDataParameter[] parameters)
{
var command = new MySqlCommand(storedProcName, connection) { CommandType = CommandType.StoredProcedure, CommandTimeout = 60 };
foreach (MySqlParameter parameter in parameters)
{
if (parameter == null)
{
continue;
}
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
command.Parameters.Add(parameter);
} return command;
}
//数据查询操作
public DataTable executeQuery(String sql)
{
DataTable myTable;
try
{
myCommand = myConnection.CreateCommand();
myCommand.CommandText = sql;
myAdapter = new MySqlDataAdapter(myCommand);
DataSet mySet = new DataSet();
myAdapter.Fill(mySet, "selectDa");
myTable = mySet.Tables["selectDa"];
return myTable;
}
catch (Exception ex)
{
//Console.WriteLine(ex);
myTable = new DataTable();
throw new Exception("数据发生错误!");
return myTable;
}
} //数据插入,删除,更新操作
public Boolean executeUpdate(String sql)
{
try
{
myCommand = myConnection.CreateCommand();
myCommand.CommandText = sql;
myCommand.ExecuteNonQuery();
if (myTransaction == null)
{
myConnection.Close();
myConnection = null;
}
return true;
}
catch (Exception ex)
{
if (myTransaction != null)
{
myTransaction.Rollback();
myTransaction = null;
throw new Exception("数据发生错误,正在启用事务回滚!");
}
else if (myConnection == null)
{
throw new Exception("请启用事务!");
}
else
{
throw new Exception("发生错误!");
}
Console.WriteLine(ex);
return false;
}
}
public MySqlDataReader ExecuteReader(String sql, params MySqlParameter[] commandParameters)
{
return ExecuteReader(myConnection, CommandType.Text, sql, commandParameters);
} public MySqlDataReader ExecuteReader(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
MySqlDataReader rdr = null;
try
{
rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (MySqlException e)
{
conn.Close();
conn.Dispose(); throw e;
}
cmd.Parameters.Clear(); return rdr;
}
public object ExecuteScalar(String sql, params MySqlParameter[] commandParameters)
{
return ExecuteScalar(myConnection, CommandType.Text, sql, commandParameters);
}
public object ExecuteScalar(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
object val;
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
try
{
val = cmd.ExecuteScalar();
}
catch (MySqlException e)
{
conn.Close();
conn.Dispose();
throw e;
}
cmd.Parameters.Clear();
return val;
} /// <param name="sql">命令语句</param>
/// <param name="commandParameters">命令的参数</param>
/// <returns>一个须转换成其它类型的值</returns>
public bool ExecuteNonQuery(string sql, params MySqlParameter[] commandParameters)
{
return ExecuteNonQuery(myConnection, CommandType.Text, sql, commandParameters);
}
public bool ExecuteNonQuery(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
int effectRows = 0;
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
try
{
effectRows = cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
conn.Close();
conn.Dispose();
throw e;
}
cmd.Parameters.Clear();
return effectRows > 0;
} public DataSet Query(string sqlString)
{
return Query(sqlString, new MySqlParameter[] { });
} /// <param name="sql">SQL语句</param>
/// <param name="cmdParms">MySqlCommand参数数组(可为null值)</param>
/// <returns></returns>
public DataSet Query(string sql, params MySqlParameter[] cmdParms)
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, myConnection, CommandType.Text, sql, cmdParms);
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
myConnection.Close();
cmd.Parameters.Clear();
return ds; }
public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
{
var dataSet = new DataSet();
myConnection.Open();
var sqlDa = new MySqlDataAdapter
{
SelectCommand = buildQueryCommand(myConnection, storedProcName, parameters)
};
sqlDa.Fill(dataSet, tableName);
myConnection.Close();
return dataSet;
} //创建事务
public void createTransaction()
{
try
{
myTransaction = myConnection.BeginTransaction();
}
catch (Exception ex)
{
//Console.WriteLine(ex);
throw new Exception("启用事务失败!");
}
}
//提交事务
public void commitTransaction()
{
try
{
if (myTransaction != null) myTransaction.Commit(); }
catch (Exception ex)
{
myTransaction.Rollback();
Console.WriteLine(ex);
throw new Exception("数据发生错误,正在启用事务回滚!");
}
finally
{
myConnection.Close();
myConnection = null;
}
}
}
}
有没有好的解决方案?
微软对Oracel,sql server等数据库支持相当的好,是对mysql支持不好吗?
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using System.IO;namespace Maticsoft.DBUtility
{
public class MySqlHelper
{
private MySqlConnection myConnection;
private MySqlCommand myCommand;
private MySqlDataAdapter myAdapter;
private MySqlTransaction myTransaction; public MySqlHelper()
{
getConnection();
} //建立DB连接
public void getConnection()
{
//StreamReader din = File.OpenText("TextFile.ini");
//string contString = din.ReadLine();
string contString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionStringMySql"].ConnectionString; try
{
myConnection = new MySqlConnection();
myConnection.ConnectionString = contString;
myConnection.Open(); }
catch (Exception ex)
{
//Console.WriteLine(ex);
throw new Exception("连接失败!");
}
}
private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
{ if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = cmdText; cmd.CommandType = cmdType; if (cmdParms != null)
{
foreach (MySqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
} private static MySqlCommand buildQueryCommand(MySqlConnection connection, string storedProcName,
IDataParameter[] parameters)
{
var command = new MySqlCommand(storedProcName, connection) { CommandType = CommandType.StoredProcedure, CommandTimeout = 60 };
foreach (MySqlParameter parameter in parameters)
{
if (parameter == null)
{
continue;
}
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
command.Parameters.Add(parameter);
} return command;
}
//数据查询操作
public DataTable executeQuery(String sql)
{
DataTable myTable;
try
{
myCommand = myConnection.CreateCommand();
myCommand.CommandText = sql;
myAdapter = new MySqlDataAdapter(myCommand);
DataSet mySet = new DataSet();
myAdapter.Fill(mySet, "selectDa");
myTable = mySet.Tables["selectDa"];
return myTable;
}
catch (Exception ex)
{
//Console.WriteLine(ex);
myTable = new DataTable();
throw new Exception("数据发生错误!");
return myTable;
}
} //数据插入,删除,更新操作
public Boolean executeUpdate(String sql)
{
try
{
myCommand = myConnection.CreateCommand();
myCommand.CommandText = sql;
myCommand.ExecuteNonQuery();
if (myTransaction == null)
{
myConnection.Close();
myConnection = null;
}
return true;
}
catch (Exception ex)
{
if (myTransaction != null)
{
myTransaction.Rollback();
myTransaction = null;
throw new Exception("数据发生错误,正在启用事务回滚!");
}
else if (myConnection == null)
{
throw new Exception("请启用事务!");
}
else
{
throw new Exception("发生错误!");
}
Console.WriteLine(ex);
return false;
}
}
public MySqlDataReader ExecuteReader(String sql, params MySqlParameter[] commandParameters)
{
return ExecuteReader(myConnection, CommandType.Text, sql, commandParameters);
} public MySqlDataReader ExecuteReader(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
MySqlDataReader rdr = null;
try
{
rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (MySqlException e)
{
conn.Close();
conn.Dispose(); throw e;
}
cmd.Parameters.Clear(); return rdr;
}
public object ExecuteScalar(String sql, params MySqlParameter[] commandParameters)
{
return ExecuteScalar(myConnection, CommandType.Text, sql, commandParameters);
}
public object ExecuteScalar(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
object val;
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
try
{
val = cmd.ExecuteScalar();
}
catch (MySqlException e)
{
conn.Close();
conn.Dispose();
throw e;
}
cmd.Parameters.Clear();
return val;
} /// <param name="sql">命令语句</param>
/// <param name="commandParameters">命令的参数</param>
/// <returns>一个须转换成其它类型的值</returns>
public bool ExecuteNonQuery(string sql, params MySqlParameter[] commandParameters)
{
return ExecuteNonQuery(myConnection, CommandType.Text, sql, commandParameters);
}
public bool ExecuteNonQuery(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
{
int effectRows = 0;
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, cmdType, cmdText, commandParameters);
try
{
effectRows = cmd.ExecuteNonQuery();
}
catch (MySqlException e)
{
conn.Close();
conn.Dispose();
throw e;
}
cmd.Parameters.Clear();
return effectRows > 0;
} public DataSet Query(string sqlString)
{
return Query(sqlString, new MySqlParameter[] { });
} /// <param name="sql">SQL语句</param>
/// <param name="cmdParms">MySqlCommand参数数组(可为null值)</param>
/// <returns></returns>
public DataSet Query(string sql, params MySqlParameter[] cmdParms)
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, myConnection, CommandType.Text, sql, cmdParms);
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
myConnection.Close();
cmd.Parameters.Clear();
return ds; }
public DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
{
var dataSet = new DataSet();
myConnection.Open();
var sqlDa = new MySqlDataAdapter
{
SelectCommand = buildQueryCommand(myConnection, storedProcName, parameters)
};
sqlDa.Fill(dataSet, tableName);
myConnection.Close();
return dataSet;
} //创建事务
public void createTransaction()
{
try
{
myTransaction = myConnection.BeginTransaction();
}
catch (Exception ex)
{
//Console.WriteLine(ex);
throw new Exception("启用事务失败!");
}
}
//提交事务
public void commitTransaction()
{
try
{
if (myTransaction != null) myTransaction.Commit(); }
catch (Exception ex)
{
myTransaction.Rollback();
Console.WriteLine(ex);
throw new Exception("数据发生错误,正在启用事务回滚!");
}
finally
{
myConnection.Close();
myConnection = null;
}
}
}
}
连接Java很好
自己改了下,好像现在没问题了。
使用try,catch
把关闭连接的都写finally里面
finally
{
conn.Close();
conn.Dispose();
}
总结一句:写程序不能只为写程序而写程序,更应该往性能上考虑
要想写出好的程序,就必须有好的代码规范、架构设计