选择查询不起作用

时间:2015-01-10 11:31:01

标签: c# datagridview

我已经创建了一个DB类,并在我的表单中使用它,但我的选择查询不工作& 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();
    }

2 个答案:

答案 0 :(得分:1)

你忘了填满你的桌子。

public DataTable GetData(string SelectQuery)
{
    using(var da = new SqlDataAdapter(SelectQuery,xconn))
    {
        DataTable xdata = new DataTable();
        da.Fill(xdata);
        return xdata;
    }
}

答案 1 :(得分:0)

首先不要使用一个ConnectionConnection pooling是你的朋友!

  

连接池减少了新连接的次数   必须打开。平民保持对物质的所有权   连接。它通过保持一组活动来管理连接   每个给定连接配置的连接。每当一个用户   调用在连接上打开,pooler查找可用的   池中的连接。如果池连接可用,则为   将其返回给调用者而不是打开新连接。当。。。的时候   应用程序调用关闭连接,pooler将其返回   合并的一组活动连接而不是关闭它。一旦   连接返回到池中,它已准备好在池上重用   下一次公开电话。

以下是关于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个主要方法: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部分执行数据访问并不是一种好习惯。最好使用Business Layer来执行数据访问层。