0%

WPF之连接数据库和简单操作

WPF之数据库的连接和简单操作


SqlServer

  • 如何创建SqlServer的用户和设置SqlServer的权限,可在文章[Qt连接SQL Server数据库]找到如何操作

SqlConnection

  • SqlConnection表示到SqlServer的打开连接,看如下代码

SqlConnection conn = new SqlConnection("Server=.;Database=BookDB;user id=user_b;pwd=532133921")

  1. 该代码实例化了一个SqlConnection类,则对象conn可以用来表示数据库对象。

  2. 各个参数的含义:

    Server:表示连接的服务器,.表示连接本地的服务器。

    DataBase:表示连接的数据库。

    user id:表示连接的用户名;pwd:表示用户名的密码。

  3. 在创建完对象后,可以用conn.Open()语句来打开数据库。

SqlCommand

  • SqlCommand表示对SqlServer执行的一个Sql语句或存储过程,即对数据库的操作,看如下代码
1
2
3
4
5
6
7
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from S where _STATUS=@STATUS";
cmd.Parameters.Add(new SqlParameter("@STATUS", 120));
string i = (string)cmd.ExecuteScalar();
MessageBox.Show(i.ToString());
}
  1. 首先获取数据库conn的SqlCommand,即SqlCommand cmd = conn.CreateCommand()。

  2. 对cmd的CommandText属性进行赋值,该属性表示要执行的C#Sql语句。

  3. 在cmd的Parameters属性中添加@参数,cmd.Parameters.Add(new SqlParameter(“@STATUS”, 120)),即当语句执行时@STATUS会换成120。

  4. 使用cmd的执行方法ExecuteXXX()来执行Sql语句,不同的执行方法会有不同的效果。

SqlDataReader

  • SqlDataReader提供了一种从数据库读取行的只进流的方式。
1
2
3
4
5
6
7
8
9
10
11
using (SqlDataReader reader = cmd.ExecuteReader())
{
//查询结果只放在数据库中,没传到客户端,
//初始指针指向第一条数据之前,没调用一次Reader指针下移一条,直至最后一条退出循环
while (reader.Read())
{
//GetXXX(n):n表示获取数据库表中的第n列
//Console.WriteLine(reader.GetString(0)+reader.GetString(1)+reader.GetString(2));
Jlist.Add(new J(reader.GetString(0), reader.GetString(1), reader.GetString(2)));
}
}
  • SqlDataReader reader = cmd.ExecuteReader(),当cmd中的Sql语句执行后返回了多行结果,则可用ExecuteReader方法执行并返回一个读取器,即reader是一个读取器,可以用来读取返回的结果

DataSet

DataSet

  • SqlReader提供了一个不用把数据放在客户端的方式操作数据库,但当操作的数据量很少时,把数据放在数据库会增加数据库的负担,WPF提供了一个DataSet类用来存储数据库里的数据,减小数据库负担。

  • DataSet表示数据内存中的缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cmd.CommandText = "select * from S where _STATUS=@STATUS";
cmd.Parameters.Add(new SqlParameter("@STATUS", 120));
//SqlDataAdapter是一个帮我们把SqlCommand查询结果填充到DataSet
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
//DataSet相当于项目中一个复杂集合
DataSet data = new DataSet();
//adapter.Fill相当于执行了sql语句和把查询结果填充到data中
adapter.Fill(data);
////导出data中的第一个查询结果表,一般也只有一个表
//DataTable table = data.Tables[0];
////定义一个集合存储表中的各行
//DataRowCollection rows = table.Rows;
//也可以这么写
DataRowCollection rows = data.Tables[0].Rows;
for (int i = 0; i < rows.Count; ++i)
{
DataRow row = rows[i];
string sno = (string)row["SNO"];
string sname = (string)row["SNAME"];
Int16 status = (Int16)row["_STATUS"];
MessageBox.Show(sno+","+sname+","+status.ToString());
}
  1. SqlDataAdapter adapter = new SqlDataAdapter(cmd);SqlDataAdapter类是专门用来填充DataSet并执行Sql语句的

  2. adapter.Fill(data);将执行结果填充到DataSet变量中

  3. 在填充后,数据会被放在DataSet中的Table[]属性,Table[0]表示第一个表,一般也只有一个表;然后可以利用DataRowCollection来遍历此表

ConfigurationManager

  • 当我们每一次连接数据库时,总是要写那一长串的连接信息,这样非常麻烦,用户也不易进行修改,则可以把连接信息写到App.config文件中,如下:
1
2
3
4
5
<configuration>
<connectionStrings>
<add name="dbConnStr" connectionString="Server=.;DataBase=...;user id=...;pwd=..."/>
</connectionStrings>
</configuration>
  • 当你想要使用该配置信息时,可以创建ConfigurationManager对象来获取配置文件中的信息,即:(注意,ConfigurationManager需要引用System.Configuration程序集)

private static string connStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;

  • 所以,你连接数据库时就可以这么写

SqlConnection conn = new SqlConnection(connStr)

SqlHelper

  • 有时在写对数据库的操作时,总是要写一堆类似的执行语句代码,其实可以把对数据库的操作封装成一个类SqlHelper,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class SqlHelper
{
private static string connStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;
/// <summary>
/// 连接并打开数据库,执行sql语句。
/// </summary>
/// <param name="sql">sql语句的主部分</param>
/// <param name="parameters">sql语句的参数</param>
/// <returns>受影响的行数</returns>
public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();
}
}
}
/// <summary>
/// 连接并打开数据库,执行sql语句。
/// </summary>
/// <param name="sql">sql语句的主部分</param>
/// <param name="parameters">sql语句的参数</param>
/// <returns>受影响的对象</returns>
public static Object ExecuteScalar(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteScalar();
}
}
}
/// <summary>
/// 连接并打开数据库,执行sql语句。(要求SQL语句是查询结果的语句)
/// </summary>
/// <param name="sql">sql语句的主部分</param>
/// <param name="parameters">sql语句的参数</param>
/// <returns>查询结果的表结构</returns>
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
return dataset.Tables[0];
}
}
}
}

参考资料:b站

-------------本文结束感谢您的阅读-------------