SQLDataReader 运行速度太慢取决于标准
SQLDataReader going too slow depending on criteria
我正在使用 SQLDataReader 填充 asp.net 页面上的 GridView (GridView1)。 SQLDataReader 在 C# 代码隐藏中自行设置,如下所示:
string MySQLString;
MySQLString = "SELECT * FROM [vw_Report_Latest_v3_1] WHERE [FKID_Contract]=@Contract";
if ((string)Session["TSAreaString"] != "") { MySQLString = MySQLString + " AND [L1_Name]=@PA1"; }
if ((string)Session["TSSiteString"] != "") { MySQLString = MySQLString + " AND [L2_Name]=@PA2"; }
if ((string)Session["TSFeatureString"] != "") { MySQLString = MySQLString + " AND [L3_Name]=@PA3"; }
if ((string)Session["TSS1"] != "") { MySQLString = MySQLString + " AND [Spare1]=@S1"; }
if ((string)Session["TSS2"] != "") { MySQLString = MySQLString + " AND [Spare2]=@S2"; }
if ((string)Session["TSS3"] != "") { MySQLString = MySQLString + " AND [Spare3]=@S3"; }
if ((string)Session["TSS4"] != "") { MySQLString = MySQLString + " AND [Spare4]=@S4"; }
if ((string)Session["TSS5"] != "") { MySQLString = MySQLString + " AND [Spare5]=@S5"; }
if ((string)Session["TSTaskString"] != "") { MySQLString = MySQLString + " AND [Operation_Name]=@PA4"; }
if ((string)Session["TSTeamString"] != "") { MySQLString = MySQLString + " AND [Team_Name]=@Team"; }
//finish
MySQLString = MySQLString + " ORDER BY [OperationOrder], [L1_Name], [L2_Name], [L3_Name], [Operation_Name], [Team_Name]";
try
{
Conn.Open();
SqlCommand Cmd = new SqlCommand(MySQLString, Conn);
Cmd.Parameters.AddWithValue("@Contract", Convert.ToInt32(invCID.Text));
if ((string)Session["TSAreaString"] != "") { Cmd.Parameters.AddWithValue("@PA1", (string)Session["TSAreaString"]); }
if ((string)Session["TSSiteString"] != "") { Cmd.Parameters.AddWithValue("@PA2", (string)Session["TSSiteString"]); }
if ((string)Session["TSFeatureString"] != "") { Cmd.Parameters.AddWithValue("@PA3", (string)Session["TSFeatureString"]); }
if ((string)Session["TSS1"] != "") { Cmd.Parameters.AddWithValue("@S1", (string)Session["TSS1"]); }
if ((string)Session["TSS2"] != "") { Cmd.Parameters.AddWithValue("@S2", (string)Session["TSS2"]); }
if ((string)Session["TSS3"] != "") { Cmd.Parameters.AddWithValue("@S3", (string)Session["TSS3"]); }
if ((string)Session["TSS4"] != "") { Cmd.Parameters.AddWithValue("@S4", (string)Session["TSS4"]); }
if ((string)Session["TSS5"] != "") { Cmd.Parameters.AddWithValue("@S5", (string)Session["TSS5"]); }
if ((string)Session["TSTaskString"] != "") { Cmd.Parameters.AddWithValue("@PA4", (string)Session["TSTaskString"]); }
if ((string)Session["TSTeamString"] != "") { Cmd.Parameters.AddWithValue("@Team", (string)Session["TSTeamString"]); }
Cmd.Connection = Conn;
SqlDataReader reader = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
GridView1.DataSource = reader;
GridView1.DataBind();
}
finally
{
if (Conn != null) { Conn.Close(); }
}
这给我带来了严重的问题。例如,如果我们将 L1_Name(通过为 TSAreaString 赋值)设置为 "Town",它将显示 L1_Name 为 "Town" 的所有内容。这很好,花花公子。需要几秒钟,因为它是一个大城镇。
但是,如果我们将 L1_Name 设置为 "Town" 并将 TSS3(在本例中)设置为 "County",那么它需要的时间会长得多——有时会超过一分钟——尽管如此检索相同数量的记录,有时甚至更少。
不幸的是,我们必须要有这个 - 我们不能只搜索 "Town",我们必须搜索 "Town" 和 "County",因为我们的客户强加了。
来自 vw_Report_Latest_v3_1 的 运行 视图运行绝对正常。即使使用上述标准,也没有问题。这两种情况 - Town 和 Town AND County,仅通过 SQL Server 2008 在视图上花费相同的时间。
我很确定这是 reading/binding 不知何故。
您可以在几个方面进行改进。
- 您应该使用 StringBuilder 而不是 string = string +"";它更有效率
- 而不是 != "",我会建议 !string.IsNullOrEmpty((string)Session[""])。这样它就可以捕获 null、string.empty 和“”
- (个人喜好)不怕白space。在同一行上有 if 语句……很难阅读。
- 在 {} 中包装东西做得很好,如果您不这样做,下一个人就是一场噩梦
- 分离层是个好主意(正如@mason 提到的)。我个人有一个数据层来存放查询。没有逻辑。然后是业务层或 class 层。它包含逻辑。清理、验证等...然后将值传递到 class 层的代码。
- 我看到两种类型的业务层。有真正的对象风格。数据层转换数据table,然后它被加载到class。查找 POCO 以了解这一点。另一个是我几年前开始的地方,是一个图层系统。每个方法都是自包含的,只是将内容传递给数据层,如果它是一个 select,那么 returns 一个数据 table。
- 提取出联系数据库的代码。 (见底部我的代码)
你提到了一个观点。检查您的 索引 。因为这是 mysql...我不知道如何执行此操作,但是在使用 Microsoft SQL 时,您可以使用所谓的估计执行路径。所以你可以将 select 语句放在 MSSMS 软件中,而不是执行,你可以单击 "Display estimated execution path" 按钮,它会提出索引等建议。
这是您的数据层的外观以及它如何使用连接器(这是下一个代码块)
private MySQLConnector _MySQL = null;
protected MySQLConnector MySQL
{
get
{
if (_MySQL == null)
{
_MySQL = new MySQLConnector();
}
return _MySQL;
}
}
public void Update(int programId, int LocationId, string Name, string modifiedBy)
{
List<MySqlParameter> parameterList = new List<MySqlParameter>();
parameterList.Add(new MySqlParameter("ProgramID", programId));
parameterList.Add(new MySqlParameter("LocationId", LocationId));
parameterList.Add(new MySqlParameter("Name", Name));
if (!string.IsNullOrEmpty(modifiedBy))
{
parameterList.Add(new MySqlParameter("ModifiedBy", modifiedBy));
}
else
{
parameterList.Add(new MySqlParameter("ModifiedBy", DBNull.Value));
}
const string TheSql = @"
UPDATE ProgramLocation
SET
Name = @Name,
ModifiedOn = GETDATE(),
ModifiedBy = @ModifiedBy
WHERE
ProgramID = @ProgramID
AND LocationId = @LocationId";
MySQL.ExecuteNonQuerySql(TheSql, parameterList);
}
这里是联系数据库的代码。它有点过时,您可能需要更改您用来联系 MySQL 数据库的程序包。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Configuration;
using System.Reflection;
using MySql.Data.MySqlClient;
namespace DEFINETHENameSpace
{
public class MySQLConnector
{
private string connString = null;
public string TheConnectionString
{
get
{
if (string.IsNullOrEmpty(connString))
{
// connString = ConfigurationManager.ConnectionStrings["MySQLConnection"].ConnectionString;
throw new Exception("No Connection String Specified");
}
return connString;
}
set
{
connString = value;
}
}
private Exception errorMessage;
public Exception ErrorMessage
{
get
{
return errorMessage;
}
set
{
errorMessage = value;
}
}
#region ExecuteNonQuery
/// <summary>
/// THis will execute a non query, such as an insert statement
/// </summary>
/// <returns>1 for success, 0 for failed.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public int ExecuteNonQuery(string theSQLStatement)
{
int returnValue = 0;
if (!string.IsNullOrEmpty(theSQLStatement))
{
MySqlConnection connection = new MySqlConnection(TheConnectionString);
MySqlCommand command = connection.CreateCommand();
try
{
command.CommandText = theSQLStatement;
connection.Open();
command.ExecuteNonQuery();
//Success
returnValue = 1;
}
catch (Exception ex)
{
returnValue = 0;
throw ex; //ErrorMessage = ex;
// WriteToLog.Execute(ex.Message, EventLogEntryType.Error);
}
finally
{
command.Dispose();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
}
return returnValue;
}
/// <summary>
/// THis will execute a non query, such as an insert statement
/// </summary>
/// <returns>1 for success, 0 for failed.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public int ExecuteNonQuery(string theSQLStatement, List<MySqlParameter> parameters)
{
if ((parameters != null) && (parameters.Count > 0))
{
return ExecuteNonQuery(theSQLStatement, parameters.ToArray());
}
else
{
return ExecuteNonQuery(theSQLStatement);
}
}
/// <summary>
/// THis will execute a non query, such as an insert statement
/// </summary>
/// <returns>1 for success, 0 for failed.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public int ExecuteNonQuery(string theSQLStatement, MySqlParameter[] parameters)
{
if ((parameters == null) || (parameters.Count() <= 0))
{
return ExecuteNonQuery(theSQLStatement);
}
int returnValue = 0;
if (!string.IsNullOrEmpty(theSQLStatement))
{
MySqlConnection connection = new MySqlConnection(TheConnectionString);
MySqlCommand command = connection.CreateCommand();
try
{
command.CommandText = theSQLStatement;
command.Parameters.AddRange(parameters);
connection.Open();
command.ExecuteNonQuery();
//Success
returnValue = 1;
}
catch (Exception ex)
{
returnValue = 0;
throw ex; //ErrorMessage = ex;
//WriteToLog.Execute(ex.Message, EventLogEntryType.Error);
}
finally
{
command.Dispose();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
}
return returnValue;
}
#endregion
#region Execute
/// <summary>
/// THis will execute a query, such as an select statement
/// </summary>
/// <returns>Populated Datatable based on the sql select command.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public DataTable Execute(string theSQLStatement)
{
DataTable resultingDataTable = new DataTable();
if (!string.IsNullOrEmpty(theSQLStatement))
{
MySqlConnection connection = new MySqlConnection(TheConnectionString);
MySqlCommand command = connection.CreateCommand();
try
{
command.CommandText = theSQLStatement;
connection.Open();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(command.CommandText, connection);
dataAdapter.Fill(resultingDataTable);
//Success
}
catch (Exception ex)
{
throw ex; //ErrorMessage = ex;
//WriteToLog.Execute(ex.Message, EventLogEntryType.Error);
}
finally
{
command.Dispose();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
}
return resultingDataTable;
}
/// <summary>
/// THis will execute a query, such as an select statement
/// </summary>
/// <returns>Populated Datatable based on the sql select command.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public DataTable Execute(string theSQLStatement, List<MySqlParameter> parameters)
{
if ((parameters != null) && (parameters.Count > 0))
{
return Execute(theSQLStatement, parameters.ToArray());
}
else
{
return Execute(theSQLStatement);
}
}
/// <summary>
/// THis will execute a query, such as an select statement
/// </summary>
/// <returns>Populated Datatable based on the sql select command.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public DataTable Execute(string theSQLStatement, MySqlParameter[] parameters)
{
if ((parameters == null) || (parameters.Count() <= 0))
{
return Execute(theSQLStatement);
}
DataTable resultingDataTable = new DataTable();
if (!string.IsNullOrEmpty(theSQLStatement))
{
MySqlConnection connection = new MySqlConnection(TheConnectionString);
MySqlCommand command = connection.CreateCommand();
try
{
command.CommandText = theSQLStatement;
connection.Open();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(command.CommandText, connection);
dataAdapter.SelectCommand.Parameters.AddRange(parameters);
dataAdapter.Fill(resultingDataTable);
//Success
}
catch (Exception ex)
{
throw ex; //ErrorMessage = ex;
//WriteToLog.Execute(ex.Message, EventLogEntryType.Error);
}
finally
{
command.Dispose();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
}
return resultingDataTable;
}
}
#endregion
}
您的 SQL 连接代码看起来不是问题所在,GridView 也不是问题所在。尝试 [在更高的范围内] 获取您的 Session 变量并将其保存到 Dictionary<string, object>
或 Dictionary<string, string>
(或类似的方法)中并从中检索您的值,而不是为每个值访问浏览器的会话(两次)。
那个或您的 view/underlying 表的索引不存在或有问题。确保也检查这些。
一些需要考虑的事情:
1. 对于您想要做的事情,创建一个存储过程,您不必自己构建 SQL 查询。当您将来增加复杂性时,您会让自己头疼。例如,而不是:
if ((string)Session["TSAreaString"] != "") { MySQLString = MySQLString + " AND [L1_Name]=@PA1"; }
...您的存储过程可以很容易地使用 COALESCE 或 ISNULL 来获得相同的结果。
--parameter for stored procedure
@TSAreaString nvarchar(max) = NULL
SELECT v.*
FROM View v
WHERE v.TSAreaString = COALESCE(@TSAreaString, v.TSAreaString)
(SQL 服务器语法)
如果您使用这种方法,您可以删除代码的上半部分并在下半部分执行类似这样的操作:
Cmd.Parameters.AddWithValue("@Team", String.IsNullOrWhiteSpace((string)Session["TSTeamString"]) ? DBNull.Value : (string)Session["TSTeamString"];
但是,如果您要继续使用相同的方法:
使用 StringBuilder 而不是字符串。它是不可变的,如果你担心性能,它会因此表现得更好。
把你的connection对象和你的command对象包装成一个using
子句,暂时自动处理(长期来看,自己做classes来处理不同的数据库操作)。
实际上这可能是您问题的一部分,但我不确定,因为我以前没有按照您的方式做过。
不要让 reader
对象成为网格视图的数据源,而是让 class 代表你的数据,并使用 reader 来填充它的 List<YourClass>
使用
同时 (reader.Read())
{
YourList.Add(检索你的班级(reader));
}
(^ 出于某种原因,SO 不是代码高亮显示)
想通了,对于任何可能遇到类似事情的人。
基本上,正如上面其他人所说,一部分是 - 不要过多提及会话状态。相反,我做了我以前做过的事情,因为无论如何我都需要在页面上的标签中进行会话,所以只需阅读页面上的标签,而不是一直往返于会话。
然而,主要部分是更改 SQL - 但只是一点点。而不是使用,说:
MySQLString = MySQLString + " AND [Spare1]=@S1";
我用过:
MySQLString = MySQLString + " AND ([Spare1] LIKE @S1)";
似乎封装了每个条件并使用 LIKE 是关键 - 它现在在所有情况下都运行得非常快。
我正在使用 SQLDataReader 填充 asp.net 页面上的 GridView (GridView1)。 SQLDataReader 在 C# 代码隐藏中自行设置,如下所示:
string MySQLString;
MySQLString = "SELECT * FROM [vw_Report_Latest_v3_1] WHERE [FKID_Contract]=@Contract";
if ((string)Session["TSAreaString"] != "") { MySQLString = MySQLString + " AND [L1_Name]=@PA1"; }
if ((string)Session["TSSiteString"] != "") { MySQLString = MySQLString + " AND [L2_Name]=@PA2"; }
if ((string)Session["TSFeatureString"] != "") { MySQLString = MySQLString + " AND [L3_Name]=@PA3"; }
if ((string)Session["TSS1"] != "") { MySQLString = MySQLString + " AND [Spare1]=@S1"; }
if ((string)Session["TSS2"] != "") { MySQLString = MySQLString + " AND [Spare2]=@S2"; }
if ((string)Session["TSS3"] != "") { MySQLString = MySQLString + " AND [Spare3]=@S3"; }
if ((string)Session["TSS4"] != "") { MySQLString = MySQLString + " AND [Spare4]=@S4"; }
if ((string)Session["TSS5"] != "") { MySQLString = MySQLString + " AND [Spare5]=@S5"; }
if ((string)Session["TSTaskString"] != "") { MySQLString = MySQLString + " AND [Operation_Name]=@PA4"; }
if ((string)Session["TSTeamString"] != "") { MySQLString = MySQLString + " AND [Team_Name]=@Team"; }
//finish
MySQLString = MySQLString + " ORDER BY [OperationOrder], [L1_Name], [L2_Name], [L3_Name], [Operation_Name], [Team_Name]";
try
{
Conn.Open();
SqlCommand Cmd = new SqlCommand(MySQLString, Conn);
Cmd.Parameters.AddWithValue("@Contract", Convert.ToInt32(invCID.Text));
if ((string)Session["TSAreaString"] != "") { Cmd.Parameters.AddWithValue("@PA1", (string)Session["TSAreaString"]); }
if ((string)Session["TSSiteString"] != "") { Cmd.Parameters.AddWithValue("@PA2", (string)Session["TSSiteString"]); }
if ((string)Session["TSFeatureString"] != "") { Cmd.Parameters.AddWithValue("@PA3", (string)Session["TSFeatureString"]); }
if ((string)Session["TSS1"] != "") { Cmd.Parameters.AddWithValue("@S1", (string)Session["TSS1"]); }
if ((string)Session["TSS2"] != "") { Cmd.Parameters.AddWithValue("@S2", (string)Session["TSS2"]); }
if ((string)Session["TSS3"] != "") { Cmd.Parameters.AddWithValue("@S3", (string)Session["TSS3"]); }
if ((string)Session["TSS4"] != "") { Cmd.Parameters.AddWithValue("@S4", (string)Session["TSS4"]); }
if ((string)Session["TSS5"] != "") { Cmd.Parameters.AddWithValue("@S5", (string)Session["TSS5"]); }
if ((string)Session["TSTaskString"] != "") { Cmd.Parameters.AddWithValue("@PA4", (string)Session["TSTaskString"]); }
if ((string)Session["TSTeamString"] != "") { Cmd.Parameters.AddWithValue("@Team", (string)Session["TSTeamString"]); }
Cmd.Connection = Conn;
SqlDataReader reader = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
GridView1.DataSource = reader;
GridView1.DataBind();
}
finally
{
if (Conn != null) { Conn.Close(); }
}
这给我带来了严重的问题。例如,如果我们将 L1_Name(通过为 TSAreaString 赋值)设置为 "Town",它将显示 L1_Name 为 "Town" 的所有内容。这很好,花花公子。需要几秒钟,因为它是一个大城镇。
但是,如果我们将 L1_Name 设置为 "Town" 并将 TSS3(在本例中)设置为 "County",那么它需要的时间会长得多——有时会超过一分钟——尽管如此检索相同数量的记录,有时甚至更少。
不幸的是,我们必须要有这个 - 我们不能只搜索 "Town",我们必须搜索 "Town" 和 "County",因为我们的客户强加了。
来自 vw_Report_Latest_v3_1 的 运行 视图运行绝对正常。即使使用上述标准,也没有问题。这两种情况 - Town 和 Town AND County,仅通过 SQL Server 2008 在视图上花费相同的时间。
我很确定这是 reading/binding 不知何故。
您可以在几个方面进行改进。
- 您应该使用 StringBuilder 而不是 string = string +"";它更有效率
- 而不是 != "",我会建议 !string.IsNullOrEmpty((string)Session[""])。这样它就可以捕获 null、string.empty 和“”
- (个人喜好)不怕白space。在同一行上有 if 语句……很难阅读。
- 在 {} 中包装东西做得很好,如果您不这样做,下一个人就是一场噩梦
- 分离层是个好主意(正如@mason 提到的)。我个人有一个数据层来存放查询。没有逻辑。然后是业务层或 class 层。它包含逻辑。清理、验证等...然后将值传递到 class 层的代码。
- 我看到两种类型的业务层。有真正的对象风格。数据层转换数据table,然后它被加载到class。查找 POCO 以了解这一点。另一个是我几年前开始的地方,是一个图层系统。每个方法都是自包含的,只是将内容传递给数据层,如果它是一个 select,那么 returns 一个数据 table。
- 提取出联系数据库的代码。 (见底部我的代码)
你提到了一个观点。检查您的 索引 。因为这是 mysql...我不知道如何执行此操作,但是在使用 Microsoft SQL 时,您可以使用所谓的估计执行路径。所以你可以将 select 语句放在 MSSMS 软件中,而不是执行,你可以单击 "Display estimated execution path" 按钮,它会提出索引等建议。
这是您的数据层的外观以及它如何使用连接器(这是下一个代码块)
private MySQLConnector _MySQL = null;
protected MySQLConnector MySQL
{
get
{
if (_MySQL == null)
{
_MySQL = new MySQLConnector();
}
return _MySQL;
}
}
public void Update(int programId, int LocationId, string Name, string modifiedBy)
{
List<MySqlParameter> parameterList = new List<MySqlParameter>();
parameterList.Add(new MySqlParameter("ProgramID", programId));
parameterList.Add(new MySqlParameter("LocationId", LocationId));
parameterList.Add(new MySqlParameter("Name", Name));
if (!string.IsNullOrEmpty(modifiedBy))
{
parameterList.Add(new MySqlParameter("ModifiedBy", modifiedBy));
}
else
{
parameterList.Add(new MySqlParameter("ModifiedBy", DBNull.Value));
}
const string TheSql = @"
UPDATE ProgramLocation
SET
Name = @Name,
ModifiedOn = GETDATE(),
ModifiedBy = @ModifiedBy
WHERE
ProgramID = @ProgramID
AND LocationId = @LocationId";
MySQL.ExecuteNonQuerySql(TheSql, parameterList);
}
这里是联系数据库的代码。它有点过时,您可能需要更改您用来联系 MySQL 数据库的程序包。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Configuration;
using System.Reflection;
using MySql.Data.MySqlClient;
namespace DEFINETHENameSpace
{
public class MySQLConnector
{
private string connString = null;
public string TheConnectionString
{
get
{
if (string.IsNullOrEmpty(connString))
{
// connString = ConfigurationManager.ConnectionStrings["MySQLConnection"].ConnectionString;
throw new Exception("No Connection String Specified");
}
return connString;
}
set
{
connString = value;
}
}
private Exception errorMessage;
public Exception ErrorMessage
{
get
{
return errorMessage;
}
set
{
errorMessage = value;
}
}
#region ExecuteNonQuery
/// <summary>
/// THis will execute a non query, such as an insert statement
/// </summary>
/// <returns>1 for success, 0 for failed.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public int ExecuteNonQuery(string theSQLStatement)
{
int returnValue = 0;
if (!string.IsNullOrEmpty(theSQLStatement))
{
MySqlConnection connection = new MySqlConnection(TheConnectionString);
MySqlCommand command = connection.CreateCommand();
try
{
command.CommandText = theSQLStatement;
connection.Open();
command.ExecuteNonQuery();
//Success
returnValue = 1;
}
catch (Exception ex)
{
returnValue = 0;
throw ex; //ErrorMessage = ex;
// WriteToLog.Execute(ex.Message, EventLogEntryType.Error);
}
finally
{
command.Dispose();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
}
return returnValue;
}
/// <summary>
/// THis will execute a non query, such as an insert statement
/// </summary>
/// <returns>1 for success, 0 for failed.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public int ExecuteNonQuery(string theSQLStatement, List<MySqlParameter> parameters)
{
if ((parameters != null) && (parameters.Count > 0))
{
return ExecuteNonQuery(theSQLStatement, parameters.ToArray());
}
else
{
return ExecuteNonQuery(theSQLStatement);
}
}
/// <summary>
/// THis will execute a non query, such as an insert statement
/// </summary>
/// <returns>1 for success, 0 for failed.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public int ExecuteNonQuery(string theSQLStatement, MySqlParameter[] parameters)
{
if ((parameters == null) || (parameters.Count() <= 0))
{
return ExecuteNonQuery(theSQLStatement);
}
int returnValue = 0;
if (!string.IsNullOrEmpty(theSQLStatement))
{
MySqlConnection connection = new MySqlConnection(TheConnectionString);
MySqlCommand command = connection.CreateCommand();
try
{
command.CommandText = theSQLStatement;
command.Parameters.AddRange(parameters);
connection.Open();
command.ExecuteNonQuery();
//Success
returnValue = 1;
}
catch (Exception ex)
{
returnValue = 0;
throw ex; //ErrorMessage = ex;
//WriteToLog.Execute(ex.Message, EventLogEntryType.Error);
}
finally
{
command.Dispose();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
}
return returnValue;
}
#endregion
#region Execute
/// <summary>
/// THis will execute a query, such as an select statement
/// </summary>
/// <returns>Populated Datatable based on the sql select command.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public DataTable Execute(string theSQLStatement)
{
DataTable resultingDataTable = new DataTable();
if (!string.IsNullOrEmpty(theSQLStatement))
{
MySqlConnection connection = new MySqlConnection(TheConnectionString);
MySqlCommand command = connection.CreateCommand();
try
{
command.CommandText = theSQLStatement;
connection.Open();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(command.CommandText, connection);
dataAdapter.Fill(resultingDataTable);
//Success
}
catch (Exception ex)
{
throw ex; //ErrorMessage = ex;
//WriteToLog.Execute(ex.Message, EventLogEntryType.Error);
}
finally
{
command.Dispose();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
}
return resultingDataTable;
}
/// <summary>
/// THis will execute a query, such as an select statement
/// </summary>
/// <returns>Populated Datatable based on the sql select command.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public DataTable Execute(string theSQLStatement, List<MySqlParameter> parameters)
{
if ((parameters != null) && (parameters.Count > 0))
{
return Execute(theSQLStatement, parameters.ToArray());
}
else
{
return Execute(theSQLStatement);
}
}
/// <summary>
/// THis will execute a query, such as an select statement
/// </summary>
/// <returns>Populated Datatable based on the sql select command.</returns>
/// <author>James 'Gates' R.</author>
/// <createdate>8/20/2012</createdate>
public DataTable Execute(string theSQLStatement, MySqlParameter[] parameters)
{
if ((parameters == null) || (parameters.Count() <= 0))
{
return Execute(theSQLStatement);
}
DataTable resultingDataTable = new DataTable();
if (!string.IsNullOrEmpty(theSQLStatement))
{
MySqlConnection connection = new MySqlConnection(TheConnectionString);
MySqlCommand command = connection.CreateCommand();
try
{
command.CommandText = theSQLStatement;
connection.Open();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter(command.CommandText, connection);
dataAdapter.SelectCommand.Parameters.AddRange(parameters);
dataAdapter.Fill(resultingDataTable);
//Success
}
catch (Exception ex)
{
throw ex; //ErrorMessage = ex;
//WriteToLog.Execute(ex.Message, EventLogEntryType.Error);
}
finally
{
command.Dispose();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
}
connection.Dispose();
}
}
return resultingDataTable;
}
}
#endregion
}
您的 SQL 连接代码看起来不是问题所在,GridView 也不是问题所在。尝试 [在更高的范围内] 获取您的 Session 变量并将其保存到 Dictionary<string, object>
或 Dictionary<string, string>
(或类似的方法)中并从中检索您的值,而不是为每个值访问浏览器的会话(两次)。
那个或您的 view/underlying 表的索引不存在或有问题。确保也检查这些。
一些需要考虑的事情: 1. 对于您想要做的事情,创建一个存储过程,您不必自己构建 SQL 查询。当您将来增加复杂性时,您会让自己头疼。例如,而不是:
if ((string)Session["TSAreaString"] != "") { MySQLString = MySQLString + " AND [L1_Name]=@PA1"; }
...您的存储过程可以很容易地使用 COALESCE 或 ISNULL 来获得相同的结果。
--parameter for stored procedure
@TSAreaString nvarchar(max) = NULL
SELECT v.*
FROM View v
WHERE v.TSAreaString = COALESCE(@TSAreaString, v.TSAreaString)
(SQL 服务器语法)
如果您使用这种方法,您可以删除代码的上半部分并在下半部分执行类似这样的操作:
Cmd.Parameters.AddWithValue("@Team", String.IsNullOrWhiteSpace((string)Session["TSTeamString"]) ? DBNull.Value : (string)Session["TSTeamString"];
但是,如果您要继续使用相同的方法:
使用 StringBuilder 而不是字符串。它是不可变的,如果你担心性能,它会因此表现得更好。
把你的connection对象和你的command对象包装成一个
using
子句,暂时自动处理(长期来看,自己做classes来处理不同的数据库操作)。实际上这可能是您问题的一部分,但我不确定,因为我以前没有按照您的方式做过。 不要让
reader
对象成为网格视图的数据源,而是让 class 代表你的数据,并使用 reader 来填充它的List<YourClass>
使用同时 (reader.Read()) { YourList.Add(检索你的班级(reader)); }
(^ 出于某种原因,SO 不是代码高亮显示)
想通了,对于任何可能遇到类似事情的人。
基本上,正如上面其他人所说,一部分是 - 不要过多提及会话状态。相反,我做了我以前做过的事情,因为无论如何我都需要在页面上的标签中进行会话,所以只需阅读页面上的标签,而不是一直往返于会话。
然而,主要部分是更改 SQL - 但只是一点点。而不是使用,说:
MySQLString = MySQLString + " AND [Spare1]=@S1";
我用过:
MySQLString = MySQLString + " AND ([Spare1] LIKE @S1)";
似乎封装了每个条件并使用 LIKE 是关键 - 它现在在所有情况下都运行得非常快。