选择“查询不起作用”
本文关键字:不起作用 查询 选择 | 更新日期: 2023-09-27 18:36:58
我已经制作了一个数据库类并在我的表单中使用它,但我选择的查询不起作用&datagridview仍然为空。这是我的课..
class ConnectDB
{
private SqlConnection xconn;
public ConnectDB()
{
xconn = new SqlConnection(new StreamReader("ConnectionDB.txt").ReadLine());
}
public void DMLOperations(string Query) //Execute Queries e.g Insert | Update Delete
{
xconn.Open();
new SqlCommand(Query,xconn).ExecuteNonQuery();
xconn.Close();
}
public DataTable GetData(string SelectQuery)
{
DataTable xdata = new DataTable();
new SqlDataAdapter(SelectQuery,xconn);
return xdata;
}
public void CloseDB()
{
xconn.Dispose();
}
}
这是我的method
private void btnSearch_Click(object sender, EventArgs e)
{
string batch = Batch.Text;
xDB.GetData("Select * from Students Where batch ='" + batch + "' ");
dataGridView1.DataSource = xDB.GetData("Select * from Students Where batch ='"+batch+"' ");
Batch.Clear();
Batch.Focus();
}
你忘了填满你的桌子。
public DataTable GetData(string SelectQuery)
{
using(var da = new SqlDataAdapter(SelectQuery,xconn))
{
DataTable xdata = new DataTable();
da.Fill(xdata);
return xdata;
}
}
首先不要使用一个Connection
,Connection pooling
是你的朋友!
连接池减少了新连接的次数 必须打开。池处理器维护物理的所有权 连接。它通过保持一组活动状态来管理连接 每个给定连接配置的连接。每当用户 调用 在连接上打开,池程序查找可用的 池中的连接。如果池连接可用,则 将其返回给调用方,而不是打开新连接。当 应用程序调用 关闭连接,池程序将其返回到 活动连接的池化集,而不是关闭它。一旦 连接返回到池中,可以在 下一个打开调用。
以下是有关连接池的完整文章
如何构建数据访问层:
public class SqlManager
{
public static string ConnectionString
{
get
{
return ConfigurationManager.ConnectionStrings["DevConnString"].ConnectionString;
}
}
public static SqlConnection GetSqlConnection(SqlCommand cmd)
{
if (cmd.Connection == null)
{
SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
cmd.Connection = conn;
return conn;
}
return cmd.Connection;
}
public static int ExecuteNonQuery(SqlCommand cmd)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
return cmd.ExecuteNonQuery();
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static object ExecuteScalar(SqlCommand cmd)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
return cmd.ExecuteScalar();
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static DataSet GetDataSet(SqlCommand cmd)
{
return GetDataSet(cmd, "Table");
}
public static DataSet GetDataSet(SqlCommand cmd, string defaultTable)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
DataSet resultDst = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(resultDst, defaultTable);
}
return resultDst;
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
public static DataRow GetDataRow(SqlCommand cmd)
{
return GetDataRow(cmd, "Table");
}
public static DataRow GetDataRow(SqlCommand cmd, string defaultTable)
{
SqlConnection conn = GetSqlConnection(cmd);
try
{
DataSet resultDst = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(resultDst, defaultTable);
}
if (resultDst.Tables.Count > 0 && resultDst.Tables[0].Rows.Count > 0)
{
return resultDst.Tables[0].Rows[0];
}
else
{
return null;
}
}
catch
{
throw;
}
finally
{
conn.Close();
}
}
}
在这个简单的数据访问层中,我们有 4 种主要方法:ExecuteNonQuery
、ExecuteScallar
、GetDataSet
、GetDataRow
。要使用它们,您需要将它们SqlCommand
作为参数。
第三次使用SqlCommand
参数,这将有助于SQL Server缓存查询并防止SqlInjection。如果您不知道什么是 Sql Injection,请查看这篇文章: SqlInjection
最后,您的代码在 DataAccessLayer 中的外观:
private void btnSearch_Click(object sender, EventArgs e)
{
string batch = Batch.Text;
SqlCommand cmd = new SqlCommand(@"
SELECT
*
FROM
Student
WHERE
Batch=@Batch");
DataSet dst = SqlManager.GetDataSet(cmd);
dataGridView1.DataSource = dst.Tables[0];
Batch.Clear();
Batch.Focus();
}
请注意,在项目的 GUI 部分中执行数据访问不是好的做法。最好是使用业务层来执行数据访问层。