选择“查询不起作用”

本文关键字:不起作用 查询 选择 | 更新日期: 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;
    }
}

首先不要使用一个ConnectionConnection 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 种主要方法:ExecuteNonQueryExecuteScallarGetDataSetGetDataRow 。要使用它们,您需要将它们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 部分中执行数据访问不是好的做法。最好是使用业务层来执行数据访问层。