Archive for the ‘数据库’ Category

ASP.NET使用GridView对数据库快速操作

星期四, 九月 19th, 2013 5 views

①绑定及显示数据

首先在界面中创建一个SqlDataSource和一个GridView控件,配置SqlDataSource绑定到指定数据库的某一个表(例如某test表)。接下来将这个数据源绑定到GridView中(自动生成需要的行列),效果如图

此时编译运行程序即可看到test表中的内容,这段界面的代码如下(自动生成)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="id" DataSourceID="SqlDataSource1" style="margin-right: 34px">

            <Columns>
                <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
                   ReadOnly="True" SortExpression="id" />
                <asp:BoundField DataField="userName" HeaderText="userName"
                   SortExpression="userName" />
                <asp:BoundField DataField="passWord" HeaderText="passWord"
                   SortExpression="passWord" />
                <asp:BoundField DataField="Role" HeaderText="Role" SortExpression="Role" />
            </Columns>
        </asp:GridView>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
           ConnectionString="<%$ ConnectionStrings:mytestConnectionString %>"
            SelectCommand="SELECT * FROM [test] ORDER BY [id]">
        </asp:SqlDataSource>

②对数据进行编辑
如图点击GridView右侧的按钮添加一个列,在这个列中加入编辑按钮

此时会生成如下一段代码

1
 <asp:CommandField ShowEditButton="True" />

编译运行程序效果如图

点击界面上的[编辑]出现如图

即可对数据库test表的目标行进行修改,点击[修改]即可执行UPDATA命令。

以上即快速实现了一个对数据库表进行修改的Demo。

总结:
此方案的优点是开发异常迅速,基本不用编写代码即可完成对数据库表的显示、查询、以及修改。
但弊端也是由于代码编写量少,无法加入更多的逻辑内容。

BeiTown
2013.09.19

ASP.NET 数据库(SQL SERVER)操作的最简Demo

星期一, 九月 2nd, 2013 15 views

首先创建一个数据库操作基类DB.cs

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.Security.Cryptography;
/// <summary>
///DB 的摘要说明
/// </summary>
public class DB
{
    public static string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    public DB(){}

    /// <summary>
    ///创建连接
    /// </summary>
    public SqlConnection GetConnection()
    {
        return new SqlConnection(connectionString);
    }

    /// <summary>
    ///执行语句并返回行数
    /// </summary>

 <a href="http://coder.beitown.com/archives/1014#more-1014" class="more-link">(更多...)</a>

SQLSERVER 快速清空数据表方法

星期五, 八月 2nd, 2013 4 views

在日常运维中我们常常会需要清空一些数据库的表数据,常规方法是使用DELETE语句

1
DELETE FROM [表名]

此方法的优点是可以根据条件删除数据(在表名后加where),但当需要全部清空一个表时使用此方法则会显得非常缓慢,因为DELETE是逐条删除的。
所以通常清空表时可以使用TRUNCATE TABLE来清空数据表

1
TRUNCATE TABLE [表名]

此方法无论数据库表有多少行数据都是秒删,其本质就是重建一个空表的意思。

当然有时候需要条件删除也可以使用此方法,即首先备份需要保留的数据到另一个临时表中,将本表清除后再将临时表的数据插入到本表中,方法如下

1
2
3
4
5
6
7
8
9
IF object_id('tempdb..#[临时表]') IS NOT NULL --确认是否已存在
BEGIN  
      DROP TABLE #temp_table --删除待用临时表
END

SELECT * INTO #临时表 FROM [本表] WHERE 条件 --创建临时表并拷贝数据
TRUNCATE TABLE [本表] --重建表
INSERT [本表] SELECT * FROM #临时表 --将临时表插入本表
DROP TABLE #临时表 --删除临时表

更多SQL操作技巧欢迎交流讨论,谢谢关注。

BeiTown
2013.08.02

SQLSERVER查询表行数和列数

星期四, 八月 1st, 2013 5 views

①返回表行(记录)数

1
SELECT COUNT(*) AS 行数 FROM 表名

②返回表列(字段数)

1
SELECT COUNT(*) AS 列数 FROM syscolumns WHERE (id = OBJECT_ID( '表名'))

BeiTown
2013.08.01

SQL使用游标对Select结果集循环操作

星期二, 七月 30th, 2013 22 views

首先先简述一下SQL中游标的作用,我们可以将游标理解成一个数组或是一个队列,其保存了Select的结果集的地址队列。
当我们需要对Select的结果集进行循环操作时,可以先定义一个游标,并将结果集指向到这个游标当中,使用游标像指针一样访问这个结果集,如下

①声明游标

1
2
3
DECLARE @id INT --声明一个变量id
DECLARE cur CURSOR read_only FOR --声明一个名为cur的游标
SELECT Userid FROM UserTable WHERE ...... --某Select语句

上述代码意为声明一个游标指向某Select语句的结果集,read_only的意思是这个指针只用于读取,如果更新则需要使用update,这样做的好处是可以明确游标的针对性从而提高执行效率。
DECLARE @id int 意为声明一个变量id,后续会用于从游标指向的结果集中获取数据

创建完游标之后,现在需要打开这个游标并进行操作,语法如下:

②打开游标并读取游标数据

1
2
3
4
5
6
7
8
OPEN cur
Fetch NEXT FROM cur INTO @id --将cur中的下一个数据赋值给变量id

WHILE(@@FETCH_STATUS = 0)
BEGIN
    --要执行的SQL语句
    fetch NEXT FROM cur INTO @id
END

Fetch 的语法如下
Fetch [Next | Prior | First | Last | Absolute n | Relative n ] From 游标名 INTO @变量1,@变量2…

Next:返回结果集中当前行的下一行记录
Prior:返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。
First:返回结果集中的第一行记录,并且将其作为当前行。
Last:返回结果集中的最后一行,并且将其作为当前行。
Absolute n:当 n > 0 时返回从游标头开始的第n行,并且将其作为当前行;n < 0 时返回从游标末尾开始的第n行,并且将其作为当前行;n = 0 时返回当前行。
Relative n:当 n > 0 时返回从当前行之后的第n行;n < 0 时则返回当前行之前的第n行;n = 0 时返回当前行。

开启游标后,游标指针位于-1行,因此需要使用FETCH NEXT移动到Select的结果集的第一行,
WHILE(@@FETCH_STATUS = 0)循环判断是否有数据,满足条件时将执行Begin和End之间的语句。
每次执行完之后注意使用 Fetch NEXT 移动到下一行。
(更多…)

关于数据库Timeout expired…server is not responding的解决方案

星期三, 七月 3rd, 2013 44 views

当访问一个页面是出现

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 

此时表示数据库访问超时,可能此时在执行一个很费时的SQL 操作,而无法在相应时间内给予回复。
关于引起Timeout,比较常见的有可能是因为SqlConnection.ConnectionTimeout引起,或者Connection打开后没有关闭。

在这里还有另一个很有可能,就是你没有设置你的SqlCommand.CommandTimeout。

SqlCommand.CommandTimeout:
获取或设置在终止执行命令的尝试并生成错误之前的等待时间。
等待命令执行的时间(以秒为单位)。默认为 30 秒。

如果设置值 0 ,表示无限制,在CommandTimeout中应避免值 0,否则会无限期地等待执行命令。

另外出现此时错误的原因也有可能是数据库地址错误照成无法连接,此时应当检查数据库连接的配置文件。

同时,对执行SQL语句超时的处理,我们应当尽可能的对数据库的存取过程进行优化,并在读取页面做相应的分页处理等,以避免数据库操作相应时间的超时错误。

关于数据库的优化,之前的博文里已有基本优化方案,更多的方案后续会另外开篇。

本篇到此,谢谢关注。

BeiTown
2013.07.03

关于SQL Server数据库的性能优化方法

星期五, 六月 21st, 2013 9 views

数据库优化是作为运维乃至DBA所必备的常规技能。
在本篇中我们将就SQL SERVER 2005进行说明,使用到的工具:

①Sql Server Profiler:用于服务器捕获sql server 2005事件及分析性能瓶颈。
②数据库引擎优化顾问:分析在一个或多个数据库中运行的工作负荷的性能效果,并给出优化建议和方法。

以上两个工具均为Sql Server 2005自带。

首先需要使用SQL Server Profiler进行数据库跟踪,通常这个时间为4-24个小时。
打开方法:SQL Server Management Studio中–>“工具”–>“sql server profilter”

如图:

新建一个数据库跟踪,使用模版的时候需要注意一下,不同的跟踪模版的应用范围是有区别的,官方阐述如下表

模板名称 模板用途
SP_Counts 捕获一段时间内存储过程的执行行为。
Standard 创建跟踪的通用起点。 捕获所运行的全部存储过程和 Transact-SQL 批处理。 用于监视常规数据库服务器活动。
TSQL 捕获客户端提交给 SQL Server 的所有 Transact-SQL 语句及其发出时间。 用于调试客户端应用程序。
TSQL_Duration 捕获客户端提交给 SQL Server 的所有 Transact-SQL 语句及其执行时间(以毫秒位单位),并按持续时间对其进行分组。 用于识别执行速度慢的查询。
TSQL_Grouped 捕获提交给 SQL Server 的所有 Transact-SQL 语句及其发出时间。 信息按提交语句的用户或客户端分组。 用于调查某客户端或用户发出的查询。
TSQL_Locks 捕获客户端与异常锁事件一起提交到 SQL Server 的 Transact-SQL 语句。 用于排除死锁、锁超时和锁升级事件的故障。
TSQL_Replay 捕获重播跟踪所需的 Transact-SQL 语句的详细信息。 用于执行迭代优化,例如基准测试。
TSQL_SPs 捕获有关执行的所有存储过程的详细信息。 用于分析存储过程的组成步骤。 如果您怀疑过程正在重新编译,请添加 SP:Recompile 事件。
Tuning 捕获有关存储过程和 Transact-SQL 批处理执行的信息。 用于生成跟踪输出,数据库引擎优化顾问可以将该输出用作工作负荷来优化数据库。

这里我们选择Standard 默认即可。
勾选保存到文件或数据库表,这里根据情况自行选择。

(更多…)

数据库清除冗余数据的常用SQL脚本(初级)

星期三, 六月 5th, 2013 5 views

最近项目的数据库要清理一些冗余数据,冗余数据主要来自于一些死账号即长期不登录的玩家或帐户余额长期为0的玩家,基本方法就是使用SQL脚本进行批量删除。同时冗余数据大多不会只存在一个表中,因此还需要跨表进行操作。

①单个表日期筛选删除
首先是日期筛选,比如需要过滤出最后登录日期在多少年月日以前的帐号。
这里对日期筛选的脚本如下:
如删除最后登录日期在2013年1月1日0点0分之前的帐号:

1
DELETE FROM [玩家表] WHERE 最后登录日期字段名 <  '2013-1-1 00:00:00'

如果查找之后的使用大于号”>”即可

②表连接进行跨表删除
比如此时需要删除最后登录日期在2013年1月1日并且其账户余额为0的玩家帐号:

1
2
DELETE FROM [玩家表] WHERE  最后登录日期字段名 < '2013-1-1 00:00:00' AND 用户ID字段 IN
(SELECT 用户ID字段 FROM [账户表] WHERE 余额字段 = 0)

此方法为一个嵌套查询,即先在玩家表中寻找余额为0的行,再在这些行中筛选出登录日期小于13年1月1日的行并删除。通常嵌套查询会比较慢但利于理解。

③清除其他表中的无效数据
当执行了第二步操作后,玩家表中满足条件的行都将被删除,但此时账户表中该玩家的信息尚未删除,此时只需要做一个对比即可,即删除存在一个表(玩家表)而不在另一个表(账户表)中的数据。
依旧用嵌套查询的方法吧

1
2
DELETE FROM [账户表] WHERE 用户ID字段 NOT IN
(SELECT 用户ID字段 FROM [玩家表])

以上脚本即可简单的删除一些定向抛弃的数据库的冗余信息,当然由于方法相对初级因此执行效率有待提高,但对于手动脚本操作来说基本影响不大。

总结:
通过对以上三段代码的举一反三,即可完成大多数数据库的冗余数据清除。
欢迎大家提出更优秀高效的方案,后期我也会陆续更新一些更高级的冗余数据清理方案,本篇到此,谢谢关注。

BeiTown
2013.06.05

C++使用ADO方式操作SQLSERVER数据库

星期二, 六月 4th, 2013 31 views

C++连接数据库的方式常用的有 DB-Lib、ODBC、OLEDB和ADO。本篇中将使用的是ADO方式。
ADO是一个微软提供的访问数据库中数据的编程接口,关于ADO网上的描述很多,本篇直接说明如何使用,其他相关的介绍大家可以自行参考官方文档
首先需要导入一个ADO的dll库,并添加一个数据库连接指针和查询结果集指针,在头文件ADOConn.h中添加如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#import "c:\Program Files\Common Files\System\ado\msado15.dll"
no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")

class ADOConn  
{
public:
    //添加一个指向Connection对象的指针
        _ConnectionPtr m_pConnection;
    //添加一个指向Recordset对象的指针
    _RecordsetPtr m_pRecordset;

public:
    ADOConn();
    virtual ~ADOConn();

    //初始化--连接数据库
    void OnInitADOConn();
    //执行查询
    _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
    //执行SQL语句
    BOOL ExecuteSQL(_bstr_t bstrSQL);
    //断开数据库连接
    void ExitConnect();
};

如上一个数据库的操作分别需要实现以上4个函数,即初始化连接、查询、执行以及断开连接。
(更多…)