我已经创建了一个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();
}
答案 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)
首先不要使用一个Connection
,Connection 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个主要方法: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部分执行数据访问并不是一种好习惯。最好使用Business Layer来执行数据访问层。