|
| 1 | +# SQLServerHelper |
| 2 | + |
| 3 | +适用于 C# 的 SQL Server 连接辅助类,提供了对数据库的常用操作,包括执行 SQL 语句、按流的方式读取数据、填充本地 DataSet、批量提交对数据表的修改等。 |
| 4 | + |
| 5 | +## 构造函数 |
| 6 | + |
| 7 | +SQLServerHelper 对象有三种构造方式:使用用户名密码验证的构造函数、使用 Windows 身份验证的构造函数、使用连接字符串的构造函数。 |
| 8 | + |
| 9 | +```csharp |
| 10 | +//使用用户名、密码验证 |
| 11 | +SqlHelper(string dataSource, string dataBase, string user, string pwd, int timeout = 5) |
| 12 | + |
| 13 | +//或者使用Windows身份验证 |
| 14 | +SqlHelper(string dataSource, string dataBase, int timeout = 5) |
| 15 | + |
| 16 | +//传入连接字符串 |
| 17 | +SqlHelper(string connectionString) |
| 18 | +``` |
| 19 | + |
| 20 | +- **dataSource:** 数据源 |
| 21 | +- **dataBase:** 数据库 |
| 22 | +- **user:** 用户名 |
| 23 | +- **pwd:** 密码 |
| 24 | +- **timeout:** 连接超时(秒),默认5秒 |
| 25 | + |
| 26 | +通常情况下,我们使用带有用户名和密码的验证方式连接数据库。只有当数据库开启了 Windows 身份验证,并且以该用户身份登录主机时,我们才能使用直接验证身份的连接方式。 |
| 27 | + |
| 28 | +## 执行一条SQL语句 |
| 29 | + |
| 30 | +执行 SQL 语句,是最基本的操作,SQLServerHelper 提供了 **ExecuteSqlCommand()** 函数来实现: |
| 31 | + |
| 32 | +```csharp |
| 33 | +int ExecuteSqlCommand(string sqlCommand, bool closeConnection = true) |
| 34 | +``` |
| 35 | + |
| 36 | +- **sqlCommand:** 要执行的 SQL 语句 |
| 37 | +- **closeConnection:** 是否关闭连接,默认关闭 |
| 38 | +- **returns:** 执行 SQL 语句受影响的行数 |
| 39 | + |
| 40 | +**ExecuteSqlCommand()** 函数实际是对 `SqlCommand.ExecuteNonQuery()` 函数的包装。当需要批量地执行 SQL 语句时,可以将 **closeConnection** 参数设置为 false 不关闭连接,待所有语句执行完毕后再通过 **CloseConnection()** 函数关闭连接,避免了每次打开、关闭连接的时间消耗。 |
| 41 | + |
| 42 | +## 获取数据表 |
| 43 | + |
| 44 | +从数据库中获取某张数据表也是常用的操作,SQLServerHelper 提供了 **GetTable()** 函数来实现: |
| 45 | + |
| 46 | +```csharp |
| 47 | +//通过sql语句获取数据表 |
| 48 | +DataTable GetTable(string selectSqlCommand) |
| 49 | +``` |
| 50 | +- **selectSqlCommand:** 获取表的select语句 |
| 51 | + |
| 52 | +```csharp |
| 53 | +//通过表名获取数据表 |
| 54 | +DataTable GetTable(string tableName, int rows) |
| 55 | +``` |
| 56 | + |
| 57 | + |
| 58 | +- **tableName:** 获取数据表的名称 |
| 59 | +- **rows:** 查询的数据行数 |
| 60 | + |
| 61 | +可以直接通过 Select 语句来获取数据表,也可以直接通过表名和指定返回条数的方式获取数据表。函数实际上是对 `SqlDataAdapter.Fill()` 函数的包装。 |
| 62 | + |
| 63 | +## 按流的方式单向读取数据 |
| 64 | + |
| 65 | +当需要从数据库中读取大量数据时,直接返回整张表的方式就不合适了,这时就应该使用数据流的方式来读取了,SQLServerHelper 提供了 **GetDataStream()** 函数来实现: |
| 66 | + |
| 67 | +```csharp |
| 68 | +SqlDataReader GetDataStream(string selectSqlCommand) |
| 69 | +``` |
| 70 | +- **selectSqlCommand:** 获取数据的select语句 |
| 71 | +- **returns:** SqlDataReader对象 |
| 72 | + |
| 73 | +获取到 SqlDataReader 对象后,就可以通过循环的方式来一条一条的读取数据了: |
| 74 | + |
| 75 | +```csharp |
| 76 | +SqlDataReader sqlDataReader = sqlHelper.GetDataStream("select * from student where sex=N'男'"); |
| 77 | +while (sqlDataReader.Read()) |
| 78 | +{ |
| 79 | + //获取指定字段的值 |
| 80 | + string id = sqlDataReader["sid"].ToString(); |
| 81 | + string name = sqlDataReader["name"].ToString(); |
| 82 | + string sex = sqlDataReader["sex"].ToString(); |
| 83 | + string score = sqlDataReader["score"].ToString(); |
| 84 | + Console.WriteLine(id + "\t" + name + "\t" + sex + "\t" + score); |
| 85 | +} |
| 86 | +sqlHelper.CloseConnection(); |
| 87 | +``` |
| 88 | + |
| 89 | +注意:在读取完所有数据后,需要使用 **CloseConnection()** 函数手动关闭连接。 |
| 90 | + |
| 91 | +## 添加数据到指定 DataSet 中 |
| 92 | + |
| 93 | +DataSet 相当于是本地的一个临时数据库,当需要频繁从同一张数据表读取数据,或者需要批量修改表中的数据时,就可以使用 **AddDataToDataSet()** 函数在内存中建立临时的本地数据库,提高数据的读取速度。 |
| 94 | + |
| 95 | +```csharp |
| 96 | +//添加数据到指定DataSet中(添加到一张表) |
| 97 | +void AddDataToDataSet(DataSet dataSet, string selectSqlCommands, string insertTableName) |
| 98 | +``` |
| 99 | +- **dataSet:** 被填充的 DataSet |
| 100 | +- **selectSqlCommands:** 获取数据的select语句 |
| 101 | +- **insertTableName:** 插入数据表的表名 |
| 102 | + |
| 103 | +```csharp |
| 104 | +//添加数据到指定DataSet中(添加到多张表) |
| 105 | +void AddDataToDataSet(DataSet dataSet, List<string> selectSqlCommands, List<string> insertTableNames) |
| 106 | +``` |
| 107 | +- **dataSet:** 被填充的DataSet |
| 108 | +- **selectSqlCommands:** 获取数据的select语句列表 |
| 109 | +- **insertTableNames:** 对应sql语句列表的插入表名列表 |
| 110 | + |
| 111 | +**AddDataToDataSet()** 函数不仅支持在本地添加一张表,也支持同时建立多张表。 |
| 112 | + |
| 113 | +## 提交对数据表进行的修改 |
| 114 | + |
| 115 | +当我们需要对一张表做大量的修改时,通过反复执行 Update 函数就不是一个好的选择了。更好的做法是,现在本地建立一张表的备份,然后直接在内存中对表中的数据进行修改,最后再向数据库批量提交修改,SQLServerHelper 提供了 **UpdateTable()** 函数来实现: |
| 116 | + |
| 117 | +```csharp |
| 118 | +//提交对数据表进行的修改 |
| 119 | +void UpdateTable(DataTable dataTable, string createTableSqlCommand) |
| 120 | +``` |
| 121 | +- **dataTable:** 修改的数据表 |
| 122 | +- **createTableSqlCommand:** 创建数据表的sql语句 |
| 123 | + |
| 124 | +```csharp |
| 125 | +//提交对数据表进行的修改(在DataSet中的数据表) |
| 126 | +void UpdateTable(DataSet dataset, string TableName, string createTableSqlCommand) |
| 127 | +``` |
| 128 | +- **dataset:** 修改的数据表所在的DataSet |
| 129 | +- **TableName:** 创建被修改的数据表名 |
| 130 | +- **createTableSqlCommand:** 创建数据表的sql语句 |
| 131 | + |
| 132 | +**UpdateTable()** 函数支持提交直接对数据表的修改,也支持提交对 DataSet 中的数据表的修改。 |
| 133 | + |
| 134 | +注意:**createTableSqlCommand** 参数是为了让函数知晓数据表的字段结构,因而必须包含完整的建表 SQL 语句,最好直接使用建表时的 SQL 语句以避免不必要的错误。 |
| 135 | + |
| 136 | +## 注意 |
| 137 | + |
| 138 | +### 与数据库连接的管理问题 |
| 139 | + |
| 140 | +绝大多函数都会自动管理与数据库连接的打开和关闭,不需要用户的干预。只有按流的方式单向读取数据的 **GetDataStream()** 函数,需要用户在读取完所有数据后调用 **CloseConnection()** 函数手动关闭连接。如果执行 SQL 语句 **ExecuteSqlCommand()** 函数以不关闭连接的方式调用,也需要用户手动关闭连接。 |
| 141 | + |
| 142 | +### 同时读写 |
| 143 | + |
| 144 | +由于每一个 SQLServerHelper 对象只维护一个与数据库的连接,所以当读取操作与写入操作同时发生时会发生错误(例如,在按流的方式 **GetDataStream()** 单向读取数据的过程中,又调用 **ExecuteSqlCommand()** 函数向数据库中写入数据),这时候必须建立多个 SQLServerHelper 对象。 |
| 145 | + |
| 146 | +### 调用示例 |
| 147 | + |
| 148 | +具体的调用方式可以参考 [测试代码](https://github.com/jsksxs360/Xus.SQLServerHelper/blob/master/test/Program.cs) |
0 commit comments