Posts Tagged ‘BeiTown’

SQLSERVER查询表行数和列数

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

①返回表行(记录)数

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

②返回表列(字段数)

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

BeiTown
2013.08.01

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

星期二, 七月 30th, 2013 76 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 移动到下一行。
(更多…)

批处理统计指定服务器端口TCP连接数及拓展工具编写

星期一, 七月 29th, 2013 36 views

最近要对服务器指定端口进行连接数统计,服务器的一些防火墙自带了此功能,但是有时防火墙对流量影响较大,需要关闭防火墙,因此尝试使用批处理创建一个简单查看工具
首先看核心语句

1
2
@echo off
netstat -an | find ":80 " | find "ESTABLISHED" /c

该语句的意思是在netstat -an 的结果中查找满足”:80″的结果 再在其中查找满足 “ESTABLISHED” 的结果 并/c 统计行数
@echo off 的意思是关闭输入命令的回显
接下来我们可以设置其1秒钟执行一次

1
2
3
4
5
6
:loop

//这里加入待循环的语句
timeout /t 1

go loop

此时即基本满足了对指定端口连接数的实时统计。

接下来将进一步利用批处理建立一个迷你的查看工具,首先是定义一下窗口的大小、字体和背景颜色以及标题:

1
mode cols=40 lines=10 & color 2f & title 标题

上述语句意为设置 列数40 行数10 颜色4f(后续有值说明) 以及标题

关于Color的说明如下:

COLOR [attr]

attr 指定控制台输出的颜色属性

颜色属性由两个十六进制数字指定 — 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

0 = 黑色   8 = 灰色
1 = 蓝色   9 = 淡蓝色
2 = 绿色   A = 淡绿色
3 = 浅绿色   B = 淡浅绿色
4 = 红色   C = 淡红色
5 = 紫色   D = 淡紫色
6 = 黄色   E = 淡黄色
7 = 白色   F = 亮白色

结合一下整体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
mode con cols=40 lines=10 & color 2f & title BeiTown端口连接数查看器
:loop
    cls
    @echo 当前80端口连接数:
    echo.
    echo.
    netstat -an | find ":80 " | find "ESTABLISHED" /c
    echo.
    echo.
    timeout /t 1
goto loop

将此代码保存为bat格式文件,直接执行即可。
效果如图:

在下一节中我们将简述如何将批处理的回显存入变量中用于进一步编程。

本篇先到此,谢谢关注。

BeiTown
2013.07.29

C++ struct虚拟类(接口)使用范例

星期二, 六月 18th, 2013 24 views

首先是接口的编写
InterfaceTest.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
/************************************************************************/
/* 接口定义                                                             */
/************************************************************************/
struct ITestInterface
{
    virtual ~ITestInterface(){}
    virtual void Release() = 0;//释放接口
    virtual void TestFun() = 0;//接口函数示例

};
extern"C"
{
    ITestInterface* CreateInterface();//创建接口
};

接下来新建一个类实现这个接口:
CTest.h

1
2
3
4
5
6
7
8
9
10
11
#pragma once
#include "InterfaceTest.h"
/************************************************************************/
/* 接口实现                                                             */
/************************************************************************/
class CTest : public ITestInterface
{
public:
    virtual void Release();
    virtual void TestFun();
};

CTest.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "CTest.h"

ITestInterface* CreateInterface()
{
    return new CTest;
}
void CTest::Release()
{
    delete this;
}

void CTest::TestFun()
{
    //这里实现接口功能
}

接下来是该接口类的使用方法

Main.cpp

1
2
3
4
5
6
7
8
#include "InterfaceTest.h"

void main()
{
    ITestInterface* test= CreateInterface();//创建接口
    test->TestFun();//执行接口函数
    test->Release();//释放接口
}

代码即讲解,最后感谢一下FG提供的方案。
本文到此,谢谢关注。

BeiTown
2013.06.18

C++在windows下创建线程范例

星期一, 六月 17th, 2013 27 views

虽然简单,但依旧记录一下,接触和使用的语言太多,长时间不用这门语言就容易遗忘,仅当日记吧。

在windows下,常常使用SDK win32 api来编写多线程的程序,实现方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>

//Fun为自定义的线程函数
DWORD  WINAPI  Fun( LPVOID  lpParamter )
{
    while(1) {

        printf("新线程正在执行...");

    }
}

int main()
{
    HANDLE  hThread = CreateThread(NULL, 0, Fun, NULL, 0, NULL);//创建线程
    return 0;
}

以上为最简实现方法。

其他拓展后续添加。

本文到此,谢谢关注。

 

BeiTown

2013.06.17

IIS 401.1、401.2错误的解决方法

星期二, 六月 11th, 2013 63 views

401.1错误

如图,在IIS中创建一个新的网站后出现如下情况,出现401.1错误即用户访问权限错误

解决方法如下:
①确认 我的电脑–管理–本地用户和组 中IUSR_机器名帐号已经启用并且未被锁定
②确认 网站–属性–目录安全性–身份验证和访问控制中启用了匿名访问并且帐号密码正确

配置如上图。

完成以上操作后即可解决。
(更多…)

常用JS表单验证汇总(持续更新)

星期五, 六月 7th, 2013 17 views

首先是测试html页面的编写

1
2
3
4
5
6
7
8
<form name="form1" action="#" method="post" onsubmit="return check()">

帐号:<input name="ID" type="text" />
密码:<input name="PWD" type="password" />
<input name="submit" type="submit" value="提交" />  
<input name="reset" type="reset" value="取消" />

</form>

以下为相应功能的js脚本
①验证为非空

1
2
3
4
5
6
7
8
9
10
function check()
{
    if(document.form1.ID.value=="" || document.form1.PWD.value=="" )
    {
        alert("用户名或密码不能为空!");
        this.form1.ID.focus();
        return false;
    }
else form1.submit();
}

②密码位数验证

1
2
3
4
5
6
7
//添加进check()中即可
if(document.form1.zhanghao.value.length<6)
{
    alert("用户名字符不能少于6位!");
    this.form1.zhanghao.focus();
    return false;
}

BeiTown
2013.06.07

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

星期三, 六月 5th, 2013 26 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 380 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个函数,即初始化连接、查询、执行以及断开连接。
(更多…)

Android wifi机器人视频传输接收端的实现

星期三, 五月 8th, 2013 1,418 views

本篇的开发基于已将S605摄像头挂载在Openwrt系统上,并且已通过网页测试访问 http://192.168.1.1:8080/?action=snapshot 摄像头视频数据流成功的基础上。
上述过程的实现,大家可以自行在论坛里查找相关资料。本篇重点讲述如何通过Android手机端实现网页端相同的视频接收功能。

首先我们需要了解到这是一个MJPEG图片视频流,是以发送逐帧的JPEG图片数据连贯起来的动画视频。Android端通过访问目标Openwrt系统上的指定服务器端口,获取这个图片流数据,并逐帧播放出来。了解此原理之后,我们的工作即可简化为在Android端创建一个socket长连接,并对目标服务器端口发送请求,并接受请求。因为数据的传输都是以字节流的形式的,所以基本传输原理与常用的socket传输方式无基本差别,主要在用字节流的解析过程,将其还原成JPEG格式的信号。

在Android的中对于视频的显示处理通常使用surfaceView这个类,继承该类实现一个自定义的surfaceView组件即可。
surfaceView有两种创建方式,一种是在Activity中正常New出来,另一种是在UI设计界面下拖拽出一个surfaceView控件,并在xml中强制转换为自定义的surfaceView类型。
下面说下这两种方式的实现区别与用途,第一种通常用于整个界面的跳转,并且new出来的surfaceView是不受UI设计界面控制的,因此无法控制其图层的顺序,并且与其他Layout控件并存等等。实现方式是直接new即可,在我们自定义的VideoSurfaceView类里,使用第一个构造函数:

1
2
3
4
public VideoSurfaceView(Context context)
{
    super(context);
}

(更多…)