分类目录
文章索引模板
20090710 php sqlite wordpress - 八月 18, 2009 by yippee

今天开始折腾WP了


要在PHP5里面开启SQLITE支持


extension=php_pdo.dll
extension=php_pdo_sqlite.dll
extension=php_sqlite.dll


否则会报告:


Fatal error: Call to undefined function sqlite_open() in xxx.php on line XX


<?php
print_r(PDO::getAvailableDrivers());


      $db=sqlite_open(“db.sqlite”); //打开db.sqlite数据库,如果不存在则尝试创建。
 sqlite_query($db,”drop table test”);
 sqlite_query($db,”create table test (id INTEGER PRIMARY KEY,name text);”); //创建test表,id字段为自动递增主键
 sqlite_query($db,”insert into test (name) values(‘hello’);”); //插入一行内容
 sqlite_query($db,”insert into test (name) values(‘world’);”);//插入一行内容
 $result=sqlite_query($db,”select * from test”); //取得test表的所有内容
 while($row=sqlite_fetch_array($result)) { //通过while循环表中所有内容
   print “”;
   print_r($row); 
   print “”;
 }
 sqlite_close($db);//关闭数据库的连接


?>


输出:
Array ( [0] => mysql [1] => sqlite [2] => sqlite2 ) Array ( [0] => 1 [id] => 1 [1] => hello [name] => hello ) Array ( [0] => 2 [id] => 2 [1] => world [name] => world ) ?>


验证完后,按照 http://wordpress.org/extend/plugins/pdo-for-wordpress/installation/



  • Step 1: unzip the files in your wp-content directory. After unzipping the structure should look like this


    wp-content
    ->plugins
    ->themes
    ->pdo
    db.php
    index.php[maybe]


    The key thing is the presence of the pdo directory and the db.php file in the ‘root’ of the wp-content directory.



  • Step 2: Edit your wp-config.php file so that:


    this line of code is placed directly after the define(‘COLLATE’,”); line:

    define(‘DB_TYPE’, ’sqlite’);    //mysql or sqlite`

    Note: currently only mysql and sqlite are supported. I hope that more flavours will appear soon.


  •  

    标签:, , , ,
    20090709 wordpress sqlite url database - 八月 18, 2009 by yippee

    既然初步决定使用WP,就收集了一些相关的资料


    关于SQLITE:


    系统环境依赖要求:
    主机php套件必须支持SQLite和PDO扩展(不过放心,常见系统都是完美支持的);SQLite的数据库信息存于独立文件中,该文件及文件夹必须要求读写权限。很简单,就这些要求。


    升级更换wordpress数据系统:
    这里指出一个简易的方法:首先在wordpress后台中使用“工具-导出”功能导出.xml文件。


    然后,下载SQLite的wordpress功能插件-“PDO(SQLite) For Wordpress”,将压缩包中的db.php和pdo文件夹放置到wp-content文件夹中。


     


    然后,编辑wp-config.php文件,在define(‘DB_COLLATE’, ”); 后面加入“define(‘DB_TYPE’,’sqlite’);”。


    关于URL重写


    进入管理后台,点菜单紧靠右边的“设置”,点选其下的“永久链接”(Permalinks)
    点选“自定义,请在下面填入自定义结构”,再其下框里输入:/posts/%post_id%.html
    点页面右下按钮“更新永久链接结构>>”保存设置,此时在 Wordpress 的根目录自动生成里一 .htaccess 文件,内容大体如下:
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /codemo/wordpress23/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /codemo/wordpress23/index.php [L]
    </IfModule>
    # END WordPress
    刷新下你的 Wordpress 首页,便会发现帖子链接都变成形如:http://www.yyyqi.com/codemo/wordpress23/posts/1.html 的静态页形式了,伪静态顺利实现!
    另,其它自定义永久链接写法及对应效果:
    0、
    Permalinks写法:/%year%/%monthnum%/%postname%/
    效果:http://www.yyyqi.com/2007/03/zero-to-riding-the-rails-in-four-months.html
    1、
    Permalinks写法:/%year%/%monthnum%/%day%/%postname%/
    效果:http://www.yyyqi.com/2007/10/14/zero-to-riding-the-rails-in-four-months/
    2、
    Permalinks写法:/%year%/%monthnum%/%postname%.html
    效果:http://www.yyyqi.com/2007/03/zero-to-riding-the-rails-in-four-months.html
    3、
    Permalinks写法:/%year%/%monthnum%/%day%/%postname%.html
    效果:http://www.yyyqi.com/2007/03/15/zero-to-riding-the-rails-in-four-months.html
    4、
    Permalinks写法:/%category%/%postname%.html
    效果:http://www.yyyqi.com/category/zero-to-riding-the-rails-in-four-months.html


    关于数据导入导出···
    wordpress数据库表基本结构:


    wp_options:系统基本设置信息;
    wp_users:注册用户基本信息;
    wp_usermeta:注册用户附加信息,主要包括权限等设置;
    wp_categories: 日记分类,友站链接(blogroll)也包含其中;分类之间也可以有从属关系;公开日记在category_count中计数,私人日记不计数;
    wp_links:友站链接(blogroll);
    wp_link2cat: 友站链接的分类;
    wp_posts:日记,其中的上传的附件和图片也作为其中的记录,不过类别不同,与日记存在从属关系;其中有几个字段好像没用,如: post_category,post_parent
    wp_post2cat:日记(包括附件)的分类;
    wp_postmeta:日记中的一些附加信息,也包括上传附件的一些附加信息,自定义字段也存在这里,如:Jerome’s Keywords的tag属性就是保存在这里的;
    wp_comments:评论,评论的游客的userid为0;


    wordpress仅仅用了 10 个 Table就实现了这么强大的系统,让我钦佩:


        wp_comments
        wp_links
        wp_options
        wp_postmeta
        wp_posts
        wp_term_relationships
        wp_term_taxonomy
        wp_terms
        wp_usermeta
        wp_users


    下面我们按照它们之间的关系来介绍一下这几个表:


    按照功能大致分为五类。


        * user: 用户信息,包括wp_users表和wp_usermeta表。
        * link:链接信息,包括wp_links表。
        * post: 文章及评论信息,包括wp_posts、wp_postmeta、wp_comments。
        * category,link_category,tag:这个是比较复杂的信息模块,它包含了对分类,链接分类,标签的管理,包括wp_term,wp_term_relationships和wp_term_taxonomy表。
        * option: 全局设置信息,包括wp_options表。


    wp_posts
    作为一个博客系统,最核心的当然是博主发表的一些“文章”了,这些“文章”存放的地方就是这个 wp_posts 表了。注意,这里所说的“文章”是加引号的,因为这个表里存放的除了普通的文章之外,还有附件和页面(page)的一些信息。表里面的 post_type 这个字段就是用来标示类型的。还有一点需要注意的就是,这个表里一些字段是针对于 post_type 的特定类型的,比如 menu_order 这个字段是“页面(page)”特有的,用来指定“页面”的顺序。post_mime_type 是针对附件的,来指定附件的类型。


    wp_postmeta
    每篇文章的属性是不可能仅仅用 wp_posts 表里的那几个字段来完全标示的,往往还有一些因人而异的属性:写这篇文章时候的心情,地点等等。这些属性的名称和值类型都是不确定的,因此,Wordpress 采用了元信息(meta)来表示它们。这个表很简单,只有 meta_id, post_id, meta_key, meta_value 这四个字段。post_id 是相关 post 的 id。我们注意到 meta_value 是 longtext 类型的,这里仅是用来存储值,至于值的确切类型,需要程序员来关心。
    在撰写文章的时候,我们可以发现编辑框下面有一个 Custom Fields 的选项,我们可以在这里添加 post 的 meta 信息。


    wp_comments
    用户评论。除了评论的内容以外,还记录了评论用户的名字,邮箱,网址,浏览器类型等信息。比较重要的两个字段是 comment_post_ID 和 comment_approved,前一个用来指示这条评论隶属于哪一篇文章,后一个用来记录审核状况。还有一个比较有意思的是这个 commnet_agent 字段,我们可以利用这个字段来统计一下用户浏览器类型。


    wp_users
    用户帐号表。存储用户名、密码还有一些用户的基本信息。


    wp_usermeta
    类似上面的 wp_postmeta,存储一些因人而异的用户信息。(比如QQ?ICQ?)


    wp_options
    用来记录 Wordpress 的一些设置和选项。里面有一个 blog_id 字段,这个应该是用在 MU 版里面来标示不同的 Blog 的。


    wp_links
    用来存储 Blogroll 里面的链接。


    wp_terms
    wp_term_relationships
    wp_term_taxonomy


    这三个表是这里面关系最复杂的了,在 Wordpress 2.2 及以前的版本中是没有这三个表的,代之的是 wp_categories、wp_post2cat 和 wp_link2cat 这三个表。对比这两个版本我们可以发现:在 2.2 版和之前的版本,post 和 link 和 category 的关系都是通过各自单独的表来记录的。而在 2.3 版中加入了 tag 的支持,Wordpress 把 post、link、tag 的分类都抽象成了统一的形式,用新的三个表来记录这些信息。
    wp_terms
    记录分类,链接分类,标签的一些简要信息,包括名称,缩写。


    wp_term_taxonomy
    是对wp_terms中的信息的关系信息补充,有所属类型(category,link_category,tag),详细描述,父类,所拥有文章(链接)数量。


    wp_term_relationships
    关系表,多对多的,object_id是与不同的对象关联,例如wp_posts中的ID(wp_links中的link_id)等,term_taxonomy_id就是关联wp_term_taxonomy中的term_taxonomy_id。

    标签:, , , ,
    20090718 wordpress OK - 八月 18, 2009 by yippee

    搞了半天,终于搞定了。

    由于空间PHP版本的问题,没有办法使用SQLITE

    本机很快就已经搭建完成。

    数据也很快导入了。

    但是发布出现两个问题

    1、当部署到服务器的时候,安装插件的时候,发现TAG不正常显示,直接搜索插件也提示出现未知错误。原本是把自己本机弄好的直接上传,因此重新弄了一次。重新进行干净安装。但是奇怪的是,问题还是存在,然后在网吧又是正常的。

     由于服务器速度问题,数据导入倒出问题,导致折腾了好几天。

    2、数据错位问题,也许由于垃圾留言的影响,导致丢了几个BLOG,结果导入的时候没有发现,直接忽略空白内容,导致错位,标题和内容失配,只好又重新来过,这次在网吧折腾,好像速度会快些。

    主题采用的是:Contrast Style 1.1 三栏,因为比较喜欢堆彻东西。

    插件用了不少

    Antispam Bee 屏蔽垃圾留言的

    Akismet 自带反垃圾留言的,但是不知道到哪里去找被它砍掉的留言(上线才半天,报告干掉了24个)

    Disable Canonical URL Redirection WP默认首页为不带index.php

    Genki Announcement 公告栏

    Peter’s Custom Anti-Spam 增加留言验证码

    Simple Tags 智能标签,这个比较强大

    Some Chinese Please 屏蔽纯洋文留言,上次就被阿拉伯文搞死两个BLOG

    Wordpress Thread Comment 嵌套留言

    WP-PageNavi 页码导航 但是不能输入

    WP-PostViews BLOG点击数

    WP-T-Wap WAP插件

    WP Kit CN 强大 

    用来解决官方 WordPress 没有照顾到的中文相关问题。使用这个插件,你可以显示随机文章,最新留言(最新引用),留言最多文章,发表评论最多的网友,还有真正的文章摘要,等等,真正截断,没有乱码。此插件在桑葚基础上修改,支持最新评论显示表情。支持指定最新评论截断字数。使用了对中文兼容更好的截断算法,现在控制字数更精确了。

    Genki AnnouncementSCP SettingPageNaviPostViewsWP-T-WAPSimple TagsWP Kit CN

    标签:, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
    20090324 mysql root - 八月 18, 2009 by yippee

    ERROR 1130: Host \’192.168.1.3\’ is not allowed to connect to this MySQL server

    解决方法:
    1。 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"

    mysql -u root -pvmwaremysql>use mysql;mysql>update user set host = \’%\’ where user = \’root\’;mysql>select host, user from user;

    2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。

    GRANT ALL PRIVILEGES ON *.* TO \’myuser\’@\’%\’ IDENTIFIED BY \’mypassword\’ WITH GRANT OPTION;

    如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码

    GRANT ALL PRIVILEGES ON *.* TO \’myuser\’@\’192.168.1.3\’ IDENTIFIED BY \’mypassword\’ WITH GRANT OPTION;

    第一个:
    mysql默认是没有开启远程控制的,必须添加远程访问的用户。
    如果是安装版的话,从mysql提供的控制台进入。
    用root用户登陆,然后:
    grant all privileges on *.* to 创建的用户名 @"%" identified by "密码";
    flush privileges;   * 刷新刚才的内容*

    格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by "用户密码";
                @ 后面是访问mysql的客户端IP地址(或是 主机名) % 代表任意的客户端,如果填写 localhost 为本地访问(那此用户就不能远程访问该mysql数据库了)。

    同时也可以为现有的用户设置是否具有远程访问权限。如下:
    use mysql;
    update db set host = \’%\’ where user = \’用户名\’; (如果写成 host=localhost 那此用户就不具有远程访问权限)
    FLUSH PRIVILEGES;

    查看结果,执行:
       use mysql;
       select host,user,password from user;

    +————–+——–+—————+
    &line; Host         &line; User &line; Password &line;
    +————–+——–+—————–+
    &line; localhost &line;         &line;                &line;
    &line; %            &line; John &line; 123456   &line;
    &line; localhost &line; root &line;                &line;
    +————–+—— –+—————+

    总结:
         其实MySQL默认有两个数据库分别为 mysql 和 test 而MySQL用户的信息都放在数据库 mysql 的相关表中
    也可以使用 Navicat (推荐)这样的GUI工具来管理用户。

    第二个:
    解决方法:
    1。 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"

    mysql -u root -pvmwaremysql>use mysql;mysql>update user set host = \’%\’ where user = \’root\’;mysql>select host, user from user;

    2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。

    GRANT ALL PRIVILEGES ON *.* TO \’myuser\’@\’%\’ IDENTIFIED BY \’mypassword\’ WITH GRANT OPTION;

    如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码

    GRANT ALL PRIVILEGES ON *.* TO \’myuser\’@\’192.168.1.3\’ IDENTIFIED BY \’mypassword\’ WITH GRANT OPTION

    “““““`
    如果忘记了 MySQL 的 root 密码,可以用以下方法重新设置:

    1. KILL掉系统里的MySQL进程;

    2. 用以下命令启动MySQL,以不检查权限的方式启动;

    mysqld_safe -skip-grant-tables &

    3. 然后用空密码方式使用root用户登录 MySQL;

    mysql -u root

    4. 修改root用户的密码;

    mysql> update mysql.user set password=PASSWORD(\’新密码\’) where User=\’root\’;
    mysql> flush privileges;
    mysql> quit

    5. 重新启动MySQL,就可以使用新密码登录了。

    ~
    [root@localhost ~]# find / -name mysqld_safe

    刚才命令得到 mysqld_safe 目录

    标签:, ,
    20090624 sqlite insert or ignore - 八月 18, 2009 by yippee

     public override int Insert( HelpEntity e ) &leftsign;
                //构造sql
                string sql = "INSERT INTO [HelpEntity](Name,Nickname,Text,IsIncluded,Guid)VALUES(@Name,@Nickname,@Text,@IsIncluded,@Guid);select last_insert_rowid()";

                //参数构造
                SQLiteParameter[] parameters = &leftsign;
                    new SQLiteParameter("@Name",DbType.String),
                    new SQLiteParameter("@Nickname",DbType.String),
                    new SQLiteParameter("@Text",DbType.String),
                    new SQLiteParameter("@IsIncluded",DbType.Boolean),
                    new SQLiteParameter("@Guid",DbType.Guid),
                &rightsign;;

                //为参数赋值
                int i = 0;
                parameters[ i++ ].Value = e.Name;
                parameters[ i++ ].Value = e.Nickname;
                parameters[ i++ ].Value = e.Text;
                parameters[ i++ ].Value = e.IsIncluded;
                parameters[ i++ ].Value = e.Guid;

                //执行查询
                try &leftsign;
                    object obj = db.ExecuteScalar( CommandType.Text, sql, parameters );
                    if( obj != null )
                        return int.Parse( obj.ToString() );
                    return -1;
                &rightsign; catch( Exception exp ) &leftsign;
                    throw exp;
                &rightsign;
            &rightsign;

    ~
    Look at the sqlite.org: http://www.sqlite.org/lang_expr.html

    last_insert_rowid() Return the ROWID of the last row insert from this connection to the database.

    It returns last inserted rowid inside connection! You always do open and close connection while querying database. Iif you query \’last_insert_rowid()\’ you do tha same: open new connection and then you get 0.

    I know all that, but i have the same problem. I\’m using microsoft visual studio express C# with tableadapters. All queries are like: this.tableadapter.query(parameters).
    ~
    Change your SQL to:

    "insert into people (Name) values(@Name);
     SELECT last_insert_rowid() AS RecordID;";

    Then call ExecuteScalar() on it instead of ExecuteNonQuery() to get the rowid.

    Also your table definition should be:

    CREATE TABLE People (RecordID INTEGER PRIMARY KEY AUTOINCREMENT, Name VARCHAR);

    Robert
    ~
    ExecuteScalar方法返回的类型是object类型,这个方法返回sql语句执行后的第一行第一列的值,由于不知到sql语句到底是什么样的结构(有可能是int,有可能是char等等),所以ExecuteScalar方法返回一个最基本的类型object,这个类型是所有类型的基类,换句话说:可以转换为任意类型。

    ExecuteNonQuery方法是用来执行insert、delete、update语句的,由于这些语句执行后只有一个结果:“影响了**行”,所以ExecuteNonQuery方法返回的是影响的行数(int)。

    虽然SQL中列的name本身就是字符串类型,但是你通过dataReader["name"]这种方式访问这个字段,必须强制类型转换,因为dataReader["name"]就像一个数组,数组中的每个元素的类型都应该一样,所以dataReader[]这个数组中的元素类型也被定义为object类型,以方便转换。

    int.Parse(("select max(id) from [tb]").ToString())+1);

    select top 1 id from [tb] order by id desc

    select SCOPE_IDENTITY()

    I need something like: http://sqlite.phxsoftware.com/forums/p/1029/4441.aspx#4441

    INSERT INTO Timeline (name, ts)
    SELECT @name, @ts
    WHERE NOT EXISTS (SELECT 1 FROM Timeline WHERE name=@name AND ts = @ts);

    It works fine with insert. I was wondering if update can be added to the above statement.

    ~
    C:\\sqlite>sqlite3.exe testdb.db
    SQLite version 3.5.1
    Enter ".help" for instructions
    sqlite> create table people (lastname text, firstname text, salary double);
    sqlite> create unique index people_unique_1 on people (lastname, firstname);
    sqlite> insert or ignore into people values (\’smith\’, \’john\’, 44548.33);
    sqlite> select * from people;
    smith&line;john&line;44548.33
    sqlite> insert or ignore into people values (\’smith\’, \’john\’, 44548.33);
    sqlite> select * from people;
    smith&line;john&line;44548.33
    sqlite> insert or ignore into people values (\’smith\’, \’linda\’, 44548.33);
    sqlite> select * from people;
    smith&line;john&line;44548.33
    smith&line;linda&line;44548.33
    sqlite>

    标签:,
    20090625 sqlite htnl editor - 八月 18, 2009 by yippee

    HTML viewing and editing component for WinForms apps
    Heres some sample code that allows you to incorporate HTML viewing and editing into your own Windows Forms app.
    http://www.nikhilk.net/HTMLEdITingComponent.ASPx
    功能毕竟简单,代码却是不少

    A Windows Forms based text editor with HTML output
    By kevin delafield

    A Windows Forms based text editor with HTML output, implemented with a browser control in edit mode.
    http://www.codeproject.com/KB/edit/editor_in_windows_forms.aspx
    这个不错

    An extended RichTextBox to save and load "HTML lite" files
    By Oscar Londono

    This control provides a method to save and load HTML files directly, avoiding the use of RTF codes.
    似乎对汉字不是特别兼容

    WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法
    这个好像不是很··

    HTML viewing and edITing component for WinForms apps

    http://www.nikhilk.NET/HTMLEdITingComponent.ASPx

    http://www.codeproject.com/cs/miscctrl/edITor_in_windows_forms.ASP
    http://www.codeproject.com/cs/miscctrl/HTMLrichtextbox.ASP

     ~
     Sqlite数据库里指定数据类型为:Blob。

    在数据访问指定参数类型为:DbType.Binary

    然后把Excel文件读到字节数组里。

            using(FileStream file = File.Open(this.TextBox2.Text,FileMode.Open))
            &leftsign;       
                byte[] bytes = new byte[file.Length];
                file.Read(bytes, 0, Convert.ToInt32(file.Length));
                testDal.Insert(Guid.NewGuid().ToString(), bytes, null);
            &rightsign;

    数据访问存储字节数据。
    public Int32 Insert(string ID,Byte[] fileStream, SQLiteTransaction trans)
            &leftsign;
                if (conn.State == ConnectionState.Closed)
                &leftsign;
                    conn.Open();
                &rightsign;
                SQLiteCommand command;
                if (trans == null)
                &leftsign;
                    command = new SQLiteCommand("insert into test(ID,excelText) values (:ID,:excelText)", conn);
                &rightsign;
                else
                &leftsign;
                    command = new SQLiteCommand("insert into test(ID,excelText) values (:ID,:excelText)", conn, trans);
                &rightsign;
                command.Parameters.Add("ID", DbType.String);
                command.Parameters.Add("excelText", DbType.Binary);

                command.Parameters["ID"].Value = ID;
                command.Parameters["excelText"].Value = fileStream;
                try
                &leftsign;
                    return command.ExecuteNonQuery();
                &rightsign;
                catch
                &leftsign;
                    return 0;
                &rightsign;
            &rightsign;

    根据主键返回Excel的字节数据
            public byte[] GetExcel(string ID)
            &leftsign;
                if (conn.State == ConnectionState.Closed)
                &leftsign;
                    conn.Open();
                &rightsign;
                SQLiteCommand command = new SQLiteCommand("Select excelText from test where ID = :ID", conn);
                command.Parameters.Add("ID", DbType.String);
                command.Parameters["ID"].Value = ID;

                SQLiteDataReader dr = null;

                dr = command.ExecuteReader();

                byte[] File = null;
                if (dr.Read())
                &leftsign;
                    File = (byte[])dr[0];
                &rightsign;
                return File;
            &rightsign;

    把字节数据存储为文件
            using (FileStream fs = File.Create("D:\\\\Test.xls"))
            &leftsign;
                fs.Write(file, 0, file.Length);
                fs.Close();
            &rightsign;
     ~
       A。
      该方法主要是利用了 SQLiteParameter 的功能,读取blob字段。代码如下:

        FileStream m_filestream = null;
      
                try &leftsign;
               
                    m_filestream = new FileStream(@"d:\\pcinfo\\17.jpg", FileMode.Open, FileAccess.Read);          //读取图片

                    SQLiteCommand m_commd2=new SQLiteCommand();
                    m_commd2.CommandText="UPDATE test1 set timage=@idimage WHERE tparendid=78";
                                
                   
                    Byte[] m_byte = new Byte[m_filestream.Length]; //存放图片

                    m_filestream.Read(m_byte,0,m_byte.Length);

                    m_filestream.Close();

                    SQLiteParameter param_m=new SQLiteParameter("@idimage",DbType.Binary,m_byte.Length,                    ParameterDirection.Input,false,0,0,null,DataRowVersion.Current,m_byte);
                    m_commd2.Parameters.Add(param_m);                m_commd2.Parameters.Add(param_m);      //很多参数阿,注意DBType.Binary
      
                    m_commd2.Connection = m_conn;
                    m_commd2.ExecuteNonQuery();

              &rightsign;
                catch (SQLiteException ex)
                &leftsign;

                    MessageBox.Show("未能存入图片");
      
                &rightsign;
         ~
         在C#中,在datagridview列表中可能会出现日期格式不对的错误。

    发现若在SQLite中的日期格式字段如果写成 2008-8-21 在填充到datagridview中就会报错,说日期格式不对。但如果把2008-8-21 改成 2008-08-21 就OK了,晕,2008-8-21 和2008-08-21 有区别么。。。

    没办法,只能在编辑页面的DateTimePicker 控件上做出改变

    DateTimePicker tmpDtp = new DateTimePicker();
    tmpDtp.CustomFormat = "yyyy-MM-dd";
    tmpDtp.Format = DateTimePickerFormat.Custom;

    标签:, ,
    20080911 c# sqlite - 五月 9, 2009 by yippee

    20080911 c# sqlite
    http://www.yippeesoft.com

    db4o Developer Community
    http://developer.db4o.com/

    [转]如何高效使用SQLite .net (C#) – Hyke Wants to Learn asp.net (C#) – 博客园
    http://www.cnblogs.com/yelsea/archive/2007/06/21/792314.html

    C#访问SQLite数据库,.net实例,.net技巧,.net教程,电脑教程,软件教程,学网
    http://www.xue5.com/itedu/200802/106684.html
    下载System.Data.SQLite(http://sqlite.phxsoftware.com/),安装

    3.打开VS2005,参考System.Data.SQLite安装目录下的System.Data.SQLite.DLL

                SQLiteConnection cnn = new SQLiteConnection();
                cnn.ConnectionString = @"Data Source=c:sqlite-3_5_0mytest.db";
                cnn.Open();

                SQLiteCommand cmd = new SQLiteCommand();
                cmd.Connection = cnn;
                cmd.CommandText = "SELECT * FROM mytable1";
                SQLiteDataAdapter da = new SQLiteDataAdapter();
                da.SelectCommand = cmd;
                DataSet ds = new DataSet();
                da.Fill(ds);

    CodeProject: Using SQLite in your C# Application. Free source code and programming help
    http://www.codeproject.com/KB/cs/SQLiteCSharp.aspx

    CodeProject: Simple C# Wrapper for SQLite. Free source code and programming help
    http://www.codeproject.com/KB/database/cs_sqlitewrapper.aspx

    CodeProject: SQLite GUI. Free source code and programming help
    http://www.codeproject.com/KB/database/SQLite_GUI.aspx

    Using SQlite in c#
    http://www.developersdex.com/csharp/message.asp?p=1111&r=6064845
    http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers has some linkes
    to .NET wrappers.

    Finisar.SQLite
    http://adodotnetsqlite.sourceforge.net/documentation/csharp_example.php

    SourceForge.net: Files
    http://sourceforge.net/project/showfiles.php?group_id=132486&package_id=145568
    You have selected SQLite for ADO.NET 2.0
    Please choose the file that best matches your architecture or operating system from the list of releases and files contained in this package.

    Create SQLite DB and SQLite table using C# in Visual Studio 2005 – System.Data.SQLite
    http://sqlite.phxsoftware.com/forums/p/1042/4512.aspx
    using (cn = new SQLiteConnection(connectionString)) &leftsign;

        using (cmd = cn.CreateCommand()) &leftsign;

            cmd.CommandText = "create table tablename (column1 int, column2 char(1), etc);";

            cmd.CommandType = CommandType.Text;

            cn.Open();

            cmd.Execute();

            cn.Close();

        &rightsign;

    &rightsign;

    System.Data.SQLite
    http://sqlite.phxsoftware.com/
    1.0.58.0 Aug 30, 2008
    SQLite : 3.6.2

    SourceForge.net: Files
    http://sourceforge.net/project/showfiles.php?group_id=132486&package_id=145568&release_id=623152

    SQLite CVSTrac
    http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers
    ADO.NET 2.0/3.5 Provider for SQLite Supports Full and Compact Framework, Mono, ADO.NET Entity Framework, Visual Studio 2005/2008 Design-Time Support.

    SourceForge.net: ADO.NET 2.0 Provider for SQLite
    http://sourceforge.net/projects/sqlite-dotnet2
    ADO.NET 2.0/3.5 Provider for SQLite. Supports Full and Compact Framework, Entity Framework, complete with full Visual Studio 2005/2008 design-time support.

    SourceForge.net: Files
    http://sourceforge.net/project/showfiles.php?group_id=94056
    ADO.NET Data Provider for SQLite (This project is deceased, please refer to http://sourceforge.net/projects/sqlite-dotnet2)

    SQLite ADO.NET 驱动(C#) – Sqlite China
    http://www.sqlitechina.org/html/1/20071221/148.html

    和C#相关的嵌入式数据库_.Net技术文章_Asp.net_网站开发
    http://www.diybl.com/course/4_webprogram/asp.net/netjs/200847/108725.html
    #

    Native to .NET 2 incl. Compact Framework

    #

    100% object-oriented, no object-relational mapping

    #

    Designed for embedded use in zero-admin environments

    db4o 开源对象数据库
    http://www.db4o.com/china/Default.aspx?AspxAutoDetectCookieSupport=1

    标签:, ,
    20080422 sql null 排序 - 一月 13, 2009 by yippee

    20080422 sql null 排序
    http://www.yippeesoft.com

    select   *   from   table   where   age   >=   10   or   age   <   10 
      我们知道,当age为null时,上面的sql语句并不能查处那一行,因为null和10比较结果为unkonwn, 
      如果直接比较的结果是unknown,又如何排序呢? 
      ——————————————— 
      
      改成這樣: 
      select   *   from   table   where   isnull(age,0)   >=   10   or   isnull(age,0)   <   10  

      建议用这条语句:select   *   from   table   where   age>=   10   or   isnull(age,0)   <   10 
      或则是select   *   from   table   where   age>=   10   or   (case   when   age   is   null   then   1   else   0   end   )   <   10 
      order   by   (case   when   age   is   null   then   0   end),age 
      
      呵呵,select   *   from   table   取说有的数据,不管排序与否,显示所有 
      
      select   *   from   table   where   age>=   10   or   age   <   10,筛选的时候由于null数值,不能判断被排除了,所以没有被显示出来

      怎样让NULL正序排序排到最后

    TABLE
    使用SELECT   *FROM   TABLE   ORDER   BY   ID   不使用DESC   得到结果:

    ID       NUM1     NUM2
    1         10       20
    2         20       30
    3         30       40
    NULL   40       50

    10 回复次数:8

    第1个回答
    order   by   (case   when     id   is   null   then   9000   else   id))

    空值 
      空   (NULL)   值表示数值未知。空值不同于空白或零值。没有两个相等的空值。比较两个空值或将空值与任何其它数值相比均返回未知,这是因为每个空值均为未知。 
      
     空值通常表示未知、不可用或将在以后添加的数据。例如,客户的中间名首字母在客户下定单时可能不知道。 
      
      下面是有关空值的一些信息:   
      
      若要测试查询中的空值,请在   WHERE   子句中使用   IS   NULL   或   IS   NOT   NULL。 
      
      
      在   SQL   查询分析器中查看查询结果时,空值在结果集内显示为   (null)。 
      
      
      可通过以下方法在列中插入空值:在   INSERT   或   UPDATE   语句中显式声明   NULL,或不使此列进入   INSERT   语句,或使用   ALTER   TABLE   语句在现有表中新添一列。 
      
      
      不能将空值用于区分表中两行所需的信息(例如,外键或主键)。   
      在程序代码中,可以检查空值以便只在具有有效(或非空)数据的行上进行某些计算。例如,报表可以只打印社会安全列中数据不为空的列。执行计算时消除空值很重要,因为如果包含空值列,某些计算(如平均值)会不准确。 
      
      如果数据中可能包含空值,创建查询或数据修改语句消除空值或将空值转换成其它值是一个好办法(如果不想在数据中出现空值)。 
      
      
      
     重要     为了减少对已有查询或报表的维护和可能的影响,建议尽量少使用空值。对查询和数据修改语句进行规划,使空值的影响降到最小。 
      
      
      如果数据出现空值,则逻辑运算符和比较运算符有可能返回   TRUE   或   FALSE   以外的第三种结果   UNKNOWN。需要三值逻辑是导致许多应用程序出错之源。下面这些表概括了引入空值比较的效果。 
      
      下表显示将   AND   运算符应用到两个布尔操作数的结果。 
      
      AND   TRUE   UNKNOWN   FALSE   
      TRUE   TRUE   UNKNOWN   FALSE   
      UNKNOWN   UNKNOWN   UNKNOWN   FALSE   
      FALSE   FALSE   FALSE   FALSE   
      
      
      下表显示将   OR   运算符应用到两个布尔操作数的结果。 
      
      OR   TRUE   UNKNOWN   FALSE   
      TRUE   TRUE   TRUE   TRUE   
      UNKNOWN   TRUE   UNKNOWN   UNKNOWN   
      FALSE   TRUE   UNKNOWN   FALSE   
      
      
      下表显示   NOT   运算符求反或反转方式,以及布尔运算符的结果。 
      
      应用了   NOT   运算符的布尔表达式   取值为   
      TRUE   FALSE   
      UNKNOWN   UNKNOWN   
      FALSE   TRUE   
      
      
     SQL-92   标准引入了关键字   IS   NULL   和   IS   NOT   NULL   来测试空值。 
      
      应用了   IS   NULL   运算符的布尔表达式   取值为   应用了   IS   NOT   NULL   运算符的布尔表达式   取值为   
      TRUE   FALSE   TRUE   TRUE   
      NULL   TRUE   NULL   FALSE   
      FALSE   FALSE   FALSE   TRUE   
      
      
      Transact-SQL   还提供扩展空值处理。如果   ANSI_NULLS   选项设为关,则空值之间的比较(如   NULL   =   NULL)等于   TRUE。空值与任何其它数据类型之间的比较等于   FALSE。  

    标签:
    20080304 sql2005 sql2000 数据 转换 - 十二月 11, 2008 by yippee

    20080304 sql2005 sql2000 数据 转换
    http://www.yippeesoft.com

    2005转到2000的步骤步骤
    1. 生成for 2000版本的数据库脚本
    2005 的manger studio
    – 打开"对象资源管理器"(没有的话按F8), 连接到你的实例
    – 右键要转到2000的库
    – 任务
    – 生成脚本
    – 在"脚本向导"的"选择数据库"中, 确定选择的是要转到2000的库
    – 勾选"为所选数据库中的所有对象编写脚本"
    – 在接下来的"选择脚本选项"中, 找到"为服务器版本编写脚本"项, 选择"SQL Server 2000"
    – 其他选项根据需要设置
    – 最后把脚本保存到一个 .sql 脚本文件

    2. 在2000中创建目标数据库
    在查询分析器(或2005的manger studio在打开脚本文件), 连接到SQL Server 2000,执行上面生成的脚本.以创建一个新的数据库

    3. 将数据从2005导到2000
    2005 的manger studio
    – 打开"对象资源管理器"(没有的话按F8), 连接到你的实例
    – 右键要转到2000的库
    – 任务
    – 导出数据
    – 在"SQL Server 导入和导出向导"的"选择数据源"步骤中, 确定选择的是要导出的数据库
    – 在"选择目标"步骤中, 连接到 2000, 并选择步骤2新建的库
    – 在"选择源表和源视图"中, 选择所有的表
    – 最后完成

    今天将2005中数据库备份,然后在2000中还原,出现了一些问题。网上搜一把,发现问题出在数据库兼容的问题上。

    网上看到的解决方法,一般来说是这样:
    –在2005中将源数据库的结构导出成一个sql文件
    –在目的机器上新建数据库,然后使用该sql文件建立相关对象
    –利用导入/导出功能将源数据库中的数据导入到目的数据库中

    值得注意的是:
    如果源数据库要拷贝的表有外键,注意移动的顺序,有时要分批移动,否则外键主键,索引可能丢失;
    或者一次性的复制到目标数据库中,再重新建立外键,主键,索引。
    其实建立数据库时,建立外键,主键,索引的文件应该和建表文件分开,
    而且用的数据文件也分开,并分别放在不同的驱动器上,有利于数据库的优化。

    以下是SQL2005生成的脚本:
     
     1  SET ANSI_NULLS ON
     2  GO
     3  SET QUOTED_IDENTIFIER ON
     4  GO
     5  IF NOT EXISTS (Select * FROM sys.objects Where object_id = OBJECT_ID(N\’[dbo].[web3_News]\’) AND type in (N\’U\’))
     6  BEGIN
     7  Create TABLE [dbo].[web3_News](
     8    [ID] [int] IDENTITY(1,1) NOT NULL,
     9    [Title] [varchar](100) NULL,
    10    [Contents] [varchar](250) NULL,
    11  CONSTRAINT [PK_web3_News] PRIMARY KEY CLUSTERED
    12  (
    13    [ID] ASC
    14  )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    15  ) ON [PRIMARY]
    16  END
     

    再看一下SQL2000生成的的脚本:
     
     1  if exists (select * from dbo.sysobjects where id = object_id(N\’[dbo].[web3_News]\’) and OBJECTPROPERTY(id, N\’IsUserTable\’) = 1)
     2  drop table [dbo].[web3_News]
     3  GO
     4
     5  Create TABLE [dbo].[web3_News] (
     6    [ID] [int] IDENTITY (1, 1) NOT NULL ,
     7    [Title] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
     8    [Contents] [varchar] (250) COLLATE Chinese_PRC_CI_AS NULL
     9  ) ON [PRIMARY]
    10  GO
    11
    12  Alter TABLE [dbo].[web3_News] WITH NOCHECK ADD
    13    CONSTRAINT [PK_web3_News] PRIMARY KEY  CLUSTERED
    14    (
    15        [ID]
    16    )  ON [PRIMARY]
    17  GO

    本工具用于批量下载和安装补丁更新.同时集成下载和智能安装功能.本工具完全免费. 主要更新: 1.此版本更新了异步安装功能,改进了在安装过程中无法取消的问题. 2.安装更新时会自动跳过已安装的更新,即已经安装的更新不会在次安装. 3.可以选择下载未安装的更新 4.可以导出到列表,以便导入到迅雷,FlashGet等工具中高速下载. 5.改进了注册表扫描算法,得到的已安装更新更全,更准确. 6.取消了即时显示补丁大小的功能,该会导致速度慢和占用带宽,以及会出现线程问题. 本工具对于要经常重装系统的朋友很有好处,下载的更新可以存储下来,以便下次使用,自带的更新功能不会保存已经下载过的更新重装系统后又要重新下载. 要运行该软件,需要有.NET Framework2.0或3.0

    http://wud.jcarle.com/

    转自:http://www.tongyi.net/article/20050201/200502014190.shtml
    1:   编译。
    选取UltraEdit的菜单: 高级-〉工具配置
    编译C# Console
    命令行填:
    csc %n%e
    工作目录:
    %p
    名称随意。
    保存活动文件,输出到列表窗口,捕捉输出 这3个都选上。 最后点击 “插入“。

    %P        Path only ("C:\\project\\test\\")
    %N        fileName only ("test")
    %E        Extension only (".c")

    编译C# Console 有图标:
    csc /win32icon:app.ico %n%e

    编译C# dll:
    csc /t:library /out:%n.dll %n%e

    编译C# winexe:
    csc /t:winexe %n%e

    编译C# winexe有图标:
    csc /t:winexe /win32icon:app.ico %n%e

    然后,我的电脑-〉属性-〉高级-〉环境变量-〉
    Path 编辑为
    %SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem;%SystemRoot%\\Microsoft.NET\\Framework\\v1.1.4322\\

    2:   关联。
    高级-〉配置-〉文件关联
    我使用的 : .cst ,文件描述:C#源文件 ,点添加即可。以后可双击直接打开.cst文件。 就是文本文件改后缀为.cst即可。

    3:   上色。
    高级-〉配置-〉语法着色 -〉语法文件全名
    我的是 :  D:\\UltraEdit\\WORDFILE.TXT   点打开。
    找到
    /L7"C#" Line Comment = // Block Comment On = /* Block Comment Off = */
    Escape Char = \\ String Chars = "\’ File Extensions = CS
    在后面加上CST
    /L7"C#" Line Comment = // Block Comment On = /* Block Comment Off = */
    Escape Char = \\ String Chars = "\’ File Extensions = CS CST
    这样双击打开cst文件时就会自动加上C#语言的语法着色。

    标签:, , ,

    20080302 国际歌 sql 2005 jdk - 十一月 27, 2008 by yippee

    20080302 国际歌 sql 2005 jdk
    http://www.yippeesoft.com

     我现在听的歌是国际歌,不过是日文版的,在我的电脑里还存着法文和唐朝乐队好几个版本,日文版的不仅唱腔怪异,还加入了类似钹铙和唢呐之类的日本本土乐器,听起就像在做道场,忍不住想起我那些早逝的先人来。
                   唐朝的加入了架子鼓和电吉他,没有前奏,一开始就是一个男青年撕声竭力地吼着,起来,饥寒交迫的奴隶!起来,全世界受苦的人!我不知道是什么原因让他对这个社会如此的绝望。反正我对有“起来”这样歌词的歌曲是非常反感的,因为我起床的铃声就是《义勇军进行曲》,一到点它就吼着:起来,不愿做奴隶的人们,起来……催促我赶快去做奴隶,不然就没工资拿了。
                  相比起来,我还是比较喜欢法文版的国际歌,一是人家是原版,应该支持。巴黎公社失败后,革命者遭到反扑和屠杀,鲍狄埃同志怀揣着枪管发烫的手枪(有史实记载),躲到了一个朋友的家里。他朋友说,咋喃,老鲍,你咋子了,咋个惊风活扯勒?鲍狄埃说,他仙人勒,公司倒了,外头到处都是追到讨工资勒!不说了,给老子拿支笔来,老子要写歌。于是鲍狄埃刷刷刷,写下了国际歌。
                  喜欢法文版国际歌的第二个原因,他在唱什么,我一句也听不懂。

    消息
    已以用户 NT AUTHORITY\\SYSTEM 的身份执行。 无法初始化链接服务器 "DB2QZ" 的 OLE DB 访问接口 "DB2OLEDB" 的数据源对象。 [SQLSTATE 42000] (错误 7303)  链接服务器"DB2QZ"的 OLE DB 访问接口 "DB2OLEDB" 返回了消息 "The user does not have the authority to access the host resource. Check your authentication credentials or contact your system administrator. SQLSTATE: HY000, SQLCODE: -1000"。 [SQLSTATE 01000] (错误 7412).  该步骤失败。

    无法对请求的用户名“sys”执行 SETUSER 操作,因为该用户名对于数据库“Testt”无效。.  该步骤失败。

    [SQLSTATE 42000] (错误 15274)

    已以用户 dbo 的身份执行。 由于当前安全上下文不可信,因此访问远程服务器的请求遭到拒绝。 [SQLSTATE 42000] (错误 15274).  该步骤失败。

    消息
    无法对请求的用户名“sys”执行 SETUSER 操作,因为该用户名对于数据库“Testt”无效。.  该步骤失败。

    SQL Server 2005的另外一个新特征是允许你改变一个存储过程的执行上下文。你可以通过用EXECUTE AS语句来改变执行上下文进而控制这些数据库对象是以哪些用户身份执行的。EXECUTE AS语句支持下列选项:
    EXECUTE AS CALLER
    EXECUTE AS USER=\’user name\’
    EXECUTE AS SELF
    EXECUTE AS OWNER
    EXECUTE AS CALLER是默认选项,这时一个存储过程是以调用用户的身份执行的。使用EXECUTE AS USER选项时,存储过程则用你指定的用户身份执行。当你使用EXECUTE AS SELF时,存储过程用创建者的身份执行。最后,你可以使用EXECUTE AS OWNER来执行存储过程,其身份是该对象的所有者。

    EXEC sp_addlinkedserver
    @server = \’WNW3XX\’,
    @srvproduct = \’Microsoft OLE DB Provider for DB2\’,
    @catalog = \’OLYMPIA\’,
    @provider = \’DB2OLEDB\’,
    @provstr=\’NetLib=SNA;NetAddr=;NetPort=;RemoteLU=OLYMPIA;LocalLU=LOCAL;ModeName=QPCSUPP;User ID=WNW3XX;Password=WNW3XX;InitCat=OLYMPIA;Default Schema=WNW3XX;PkgCol=WNW3XX;TPName=;Commit=YES;IsoLvl=NC;AccMode=;CCSID=37;PCCodePage=1252;BinAsChar=NO;Data Source=Olympia_WNW3XX\’

    EXEC sp_addlinkedsrvlogin \’WNW3XX\’, false, NULL, \’WNW3XX\’, \’WNW3XX\’
        

        It looks like there are 6 services related to SQL Server:

    a) SQL Server -
          .\\administrator
    b) SQL Server Active Directory Helper -
         NT AUTHORITY\\NetworkService
    c) SQL Server Agent -
         HT01\\Administrator
    d) SQL Server Browser -
         HT01\\Administrator
    e) SQL Server FullText Search -
         .\\Administrator
    f) SQL Server VSS Writer -
         Local System Account

    步骤一:访问JDK环境下载网址 http://java.sun.com/j2se/1.4.1/download.html

    选择 Download J2SE v 1.4.1_03 下

    点击 Windows (all languages, including English) 行最右边的 DOWNLOAD.

    步骤二:接下来的页面里填写自己的简略资料,并点击 Yes,submit 按钮.

    步骤三:接下来的页面里点击 ACCEPT 按钮.

    步骤四:接下来的页面里点击 Download j2sdk-1_4_1_03-windows-i586.exe 链接便下载.

    步骤五:安装已下载的JDK (默认安装盘符为 C:\\j2sdk1.4.1_03 ).

    注意:无需更改安装路径

    步骤六:现在开始具体配置环境

    右击”我的电脑”,选择”属性”,再选择”高级”,点击”环境变量”,注意到

    ”系统变量”,点击”新建”三次,每次创建一个系统变量 (注意大小写).

    变量名 变量值
    path C:\\j2sdk1.4.1_03\\bin
    java_home C:\\j2sdk1.4.1_03
    classpath C:\\j2sdk1.4.1_03\\lib\\tools.jar;C:\\j2sdk1.4.1_03\\jre\\lib\\rt.jar;

    变量创建完后点击”确定”,直到”属性”窗口消失.

    步骤七:打开”记事本”,输入这段代码 (注意大小写)

    class HelloWorld
    &leftsign;
        public static void main(String args[])
        &leftsign; 
            System.out.println("Hello World");
        &rightsign;
    &rightsign;

    步骤八:以 HelloWorld.java 保存文件到 d:\\java

    注意:保存地址可自由选择,文件名注意大小写.

    步骤九:进入”开始”-”所有程序”-”附件”-”命令提示符”

    直接键入 javac 回车,数秒后显示环境测试结果,出现大片英文字符即为正常.

    步骤十:更换盘符到 HelloWorld.java 文件所在目录 (D:\\java>).

    键入 javac HelloWorld.java 数秒后回到文件所在目录 (D:\\java>) 编译成功.

    键入 java HelloWorld 数秒后显示将显示 Hello World

    步骤十请注意大小写!

    萿嗻dě溡鍭,盡量汧伈丶,茵儰,峩閅绘歹匕テ艮匛

    标签:,
    20080229 PL/SQL Developer ActiveX Server - 十一月 25, 2008 by yippee

    20080229 PL/SQL Developer ActiveX Server
    http://www.yippeesoft.com

    PL/SQL Developer v7.1.4中文简介:
    集成的Oracle数据库开发环境,专门用于开发、测试、调试和优化Oracle PL/SQL存储程序单元,比如触发器等。PL/SQL Developer功能十分全面,大大缩短了程序员的开发周期。
    English Product Description:for cehx.com
    PL/SQL Developer is an Integrated Development Environment that is
    specifically targeted at the development of stored program units for Oracle
    Databases. Over time we have seen more and more business logic and
    application logic move into the Oracle Server, so that PL/SQL programming
    has become a significant part of the total development process. PL/SQL
    Developer focuses on ease of use, code quality and productivity, key
    advantages during Oracle application development.

    VSPM 虚拟串口软件可以将TCP/IP、UDP广播映射成本机的虚拟COM 口,应用程序通过访问虚拟串口,就可以完成远程控制、数据传输等功能。
    通过扩展DLL,可以实现串口互通、协议分析、数据采集等功能,提供例程代码。
    此软件可免费用于商业用途,例如串口服务器、无线DTU产品配套等。 
    软件QQ群:28173573
    Ver2.65(2008-1-17)主要更新:
    1.修正Service模式问题
    2.增加一些插件
    3.文档升级
    京金华科技专业研发生产串口服务器、CAN-bus转以太网、开关量及模拟量转以太网产品。

        PL/SQL Developer是一种集成的开发环境,专门用于开发、测试、调试和优化Oracle PL/SQL存储程序单元,比如触发器等。PL/SQL Developer功能十分全面,大大缩短了程序员的开发周期。强大的PL/SQL编辑器,完善的Debugger调试器(需要Oracle 7.3.4或以上版本)询问创建\\SQL视窗\\命令视窗\\报告视窗\\项目\\浏览器\\过程优化\\HTML手册\\Non-PL/SQL目标\\模板目录\\比较用户目标\\输出用户目标\\工具\\lug-In扩展\\Multi-threaded IDE\\简单的安装(本软件由allroundautomations中国区总代理www.softwarecn.com 授权发布。)。

        ActiveX .exe .dll Server都可以设定成多执行绪,但手册上面得大多有看没有
    懂,尤其是Project本身可设定多执行绪,而Class又可设定成MultiUSe,搞得不是
    很清楚,在经过一些testing後,整理出一些东西,以补足手册上的不清楚,看完它
    再去看手册的说明就会比较清楚啦(我想)。如果我的观念有误,也请更正。

    MyProject       假设有一个ActiveX Server,其内有一个Class和.bas Module组成
       &line;
       +- Class
       &line;     &line;
       &line;     +— MyClass
       &line;              Public  cp as long
       &line;              Private cv as Long
       &line;              Public Sub cFunc1()
       &line;                   .
       &line;                   .
       &line;              End Function
       &line;              Public Sub cFunc2()
       &line;                   .
       &line;                   .
       &line;              End Sub
       &line;
       +- Module
             &line;
             +— MyBas.Bas
                      Public basVar as long
                      Public Sub Sub1()
                             .
                             .
                      End Sub

    一、Myproject为ActiveX .exe Server
       1.MyProject设定成单一执行绪
         a.Myclass 为MultiUse
           表示该Class的每一个Instance都是固定由某一个Thread来执行,
           所谓MultiUse便是单一个执行绪可对多个Instance提供服务
          
           client A 的程式                 client B 的程式
             dim  aa as New MyClass           dim bb as New Myclass
             Call aa.cFunc1                   Call bb.cFunc2

           如上例,ClientA ClientB同时对某一部电脑上的MyProject提出需求,
           此时,第一个呼叫它的程式(假设是Call aa.cFunc1)将该Server叫起来了,
           如果此时ClientB也对之提出要求,那麽的ClinetA aa这个instance和
           Client B的bb Instance共用同一个Thread,也就是说这两个Instance必
           需进入排程,共用一个Thread的情况又有什麽特性呢?此时aa, bb共用
           MyBas.Bas内的资料,如上例中的basVar会共用,不论是改了它都会影响
           另一个人,但是bb, aa这两个Class Instance有自己的变数,即aa 有自己
           cp, cv的变数,bb也有自己的,这就是所谓的公寓模式,在.clx内的东西
           各人有各人的,但共用.bas的资料。以这个例子来说,如果aa.cFunc1已在
           执行,而且它是一个Long Job,而 bb.cFunc2也要来执行时,它便得进入
           Queue中等待,所以会有交通阻塞的情况。

          b.SingleUse
            表示某个Class的instance 只在一个Thread上执行,同样以上面的例子来看
            aa 这个Instance产生了,那它在Thread1 上执行,而同时bb也产生了,那
            它会在另一个Thread2上执行,而Thread1, Thread2本身有自己的区域资料
            ,所以aa, bb就不会用MyBas.Bas内的任何资料,正因aa, bb在不同的thread
            上执行,所以它们两个便以排程的方式来执行,不会有谁先做,另一个人一定
            得等,aa的thread先做,做了一段时间後会Swap变bb的Thread做,所以有可能
            bb.cFunc2先完成。但缺点是浪费Resource。不要被MyProject的单一执行绪给
            骗了,它是设成单一执行绪,但Class设成SingleUse时,仍有可能是
            MultiThread的Server

           另一个例子:
           Myproject中有二个Class,Class1为MultiUse, Class2为SingleUse
           且有一个MyBas.Bas Module
             Dim aa as New Class1
             Dim bb as New Class1
             Dim aa2 as New Class2
             Dim bb2 as New Class2
             aa.method1
             aa2.method2
             bb.func1
             bb2,func2

            则aa, aa2, bb 共用mybas.bas之资料,bb2没有共用,aa, bb同一个thread
            没有问题,aa2呢?那是因为SingleUse对象是Class,方才的thread虽有aa, bb
            於其上,但那是Class1, Class2尚未有Instance於thread上,故选择方才的
            thread来执行,而bb2自然得在另一个Thread上啦。这个前提是只有一个Client
            来执行,如果有两个以上Client时,我们不知执行的前後顺序,所以不易预测
            谁和谁共用资料。而我们可透过App.ThreadId来取得Thread的id,以上例来说
            如果於Class1, Class2中各有引用App.ThreadId时,会发现aa, aa2, bb所取得
            的是相同的,而bb2所取得者不相同。    

       2.MyProject设成多执行绪
            假设我们设定MyProject有4个Thread (T1 to T4)                               

           T1
            &line;
            &line;
      T4 —+—- T2
            &line;
            &line;
           T3                  如果有Client1 to 3 呼叫Server的顺序如下

       ClassA (multiUse)            client1 要求 ClassA –>A1 则於 T1执行
       ClassB (MultiUse)            client2 要求 ClassA –>A2  ..  T2 ..
       ClassC (multiUse)            client1  ..  ClassB –>B1  ..  T3 ..
       Mybas.bas                    client3  ..  ClassC –>C3  ..  T4 ..
                                    client2  ..  ClassC –>C2  ..  T1 ..
                                    client1  ..  ClassC –>C1  ..  T2 ..

      也就是说,Client 端每产生一个Instance,该Instance便会一在下一个Thread上
      执行,如此的循环,所以这个例子来看,变成A1, C2共用mybas.bas的资料,A2, C1
      是另一组共用者。如此造成谁和共用资料十分不明确,不过定的是每个.clx都有自己
      的资料,符合公寓式模型。
             
      另外,如果Instance A1(Client1所产生的ClassA Instance)於T1中执行,而A1中
      去Create Instance B时,If使用New指令则Instance B也在T1中执行,故和A1共用
      Mybas.Bas但,使用CreateObject则Instabce B会在T2中执行。

      至於三个Class中有一个是SingleUse时会如何,本人已没有再测下去,可以知道的是
      SingleUse的Class会找一个没有执行同一Class的Thread来执行,但如果4个Thread
      都有时,会不会产生第五个Thread来做,可能吧,没有力testing了。

      3.MyProject设成独立执行绪
        同多执行绪,只是没有限制thread个数。

     
    二、MyProject  是ActiveX. Dll Server
        因是.Dll 的方式存在,所以Class不可能是SingleUse,因为一个Process
        一不能有相同的两份.dll
       1.MyProject设单一执行绪
     
         客户端多执行绪.exe 有Thread 1 -3
     
           thread1, thread2, thread3同时要求该class时,则後到的要等待
         前面的处理完才能做,因该Server只有单一执行绪。各个Instance
         共用.Bas内的资料。

       2.MyProject设成公寓模型(多执行绪)
          同上的状况来说,Thread1- 3 对该Class的运作,就没有谁等谁的情况。
          因为 多执行绪.exe的各个Thread,都定义了Dll Server中的一问公寓
          ,所有在执行绪中所建之的物件都住在该执行绪定义的公寓中,除非Thread3
          使用Thread2的物件方法,那这呼叫会被排在Thread2本身目前正在处理的
          物件之後(循序化)。
                   

    标签:, , , ,
    20080117 sql2005 跨库 跨服务器 视图 - 十月 26, 2008 by yippee

    20080117 sql2005 跨库 跨服务器 视图
    http://www.yippeesoft.com


    exec sp_configure \’show advanced options\’,1
    reconfigure
    exec sp_configure \’Ad Hoc Distributed Queries\’,1
    reconfigure


    create   view   myView 
      as 
      select   *   from   OPENDATASOURCE( 
                        \’SQLOLEDB\’, 
                        \’Data   Source=192.168.0.81;User   ID=sa;Password=\’ 
                        ).wzmis4.dbo.train_arrive_infor 
       
    最后
    exec sp_configure \’Ad Hoc Distributed Queries\’,0
    reconfigure
    exec sp_configure \’show advanced options\’,0
    reconfigure

    消息 15281,级别 16,状态 1,过程 educational1,第 2 行
    SQL Server 阻止了对组件 \’Ad Hoc Distributed Queries\’ 的 STATEMENT\’OpenRowset/OpenDatasource\’ 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 \’Ad Hoc Distributed Queries\’。有关启用 \’Ad Hoc Distributed Queries\’ 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

    –首先建立链接服务器
    EXEC sp_addlinkedserver
       \’instance1\’,
       \’\',
       \’MSDASQL\’,
       NULL,
       NULL,
       \’DRIVER=&leftsign;SQL Server&rightsign;;SERVER=192.168.1.100;UID=sa;PWD=123;\’
    GO

    –查看链接服务器
    EXEC sp_linkedservers

    –删除链接服务器
    EXEC sp_dropserver \’instance1\’

    –开始查询测试
    select * from instance1.db1.dbo.table1
    select * from 别名.数据库名.dbo.表名

    经delphi连接测试,发现一个数据源并不能连接到链接服务器的表
    经尝试以下方法可以用delphi连接视图:
    create view educational1 as
    SELECT         *
    FROM             OPENDATASOURCE (\’SQLOLEDB\’,
                              \’Data Source=192.168.1.100;
                              USER ID = sa ;Password=123 \’
                               ).shbbs.dbo.educational Rowset_1

          在Sql Server中查询一下Excel文件的时候出现问题:
    SELECT *  FROM OPENROWSET( \’MICROSOFT.JET.OLEDB.4.0\’,\’Excel 8.0;IMEX=1;HDR=YES;DATABASE=D:\\a.xls\’,[sheet1$])
        结果提示:
        SQL Server 阻止了对组件 \’Ad Hoc Distributed Queries\’ 的 STATEMENT\’OpenRowset/OpenDatasource\’ 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 \’Ad Hoc Distributed Queries\’。有关启用 \’Ad Hoc Distributed Queries\’ 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
    查询相关资料,找到解决方法:

        启用Ad Hoc Distributed Queries:
    exec sp_configure \’show advanced options\’,1
    reconfigure
    exec sp_configure \’Ad Hoc Distributed Queries\’,1
    reconfigure
        使用完成后,关闭Ad Hoc Distributed Queries:
    exec sp_configure \’Ad Hoc Distributed Queries\’,0
    reconfigure
    exec sp_configure \’show advanced options\’,0
    reconfigure
    感谢原创.

    解除SQL阻止:
    SQL Server 阻止了对组件 \’Ad Hoc Distributed Queries\’ 的 STATEMENT\’OpenRowset/OpenDatasource\’ 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 \’Ad Hoc Distributed Queries\’。有关启用 \’Ad Hoc Distributed Queries\’ 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
    因为SQL2005默认是没有开启\’Ad Hoc Distributed Queries\’ 组件,开启方法如下

    EXEC sp_configure \’show advanced options\’, 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure \’Ad Hoc Distributed Queries\’, 1
    GO
    RECONFIGURE
    GO

    标签:, , , ,
    20071226 服务器 sql - 十月 17, 2008 by yippee

    20071226 服务器 sql
    http://www.yippeesoft.com

    http://blog.csdn.net/ruanruoshi/archive/2006/04/14/663304.aspx
    高性能服务器软件开发

    http://download.microsoft.com/download/7/b/3/7b3aa957-4865-427d-9650-789179a5d666/VCON02_final.ppt
    Windows Server 2003
    梦幻性能和伸缩性改进
    Brad Waters
    Scalability And Enterprise Lead
    Windows Base OS Performance Group
    对现有的性能,网络堆栈以及关键网络应用进行了改进; Windows Media Services的性能最高提升了6倍之多
    网络
    由于内存管理方面的改进,能够支持的并发用户数量提高了2倍
    终端服务器
    提高了2倍到3倍的伸缩性和性能;速度得到极大提升的搜索,身份验证和复制操作
    Active Directory
    对客户机/服务器架构和OS伸缩性的改进提供了2倍于以往的性能表现
    文件服务器
    通过对IIS 6.0 Web服务器进行全面的重新设计;不仅将性能和伸缩性提高了2倍,而且极大改善了系统的可靠性和Web托管能力
    Web服务器
    显著的软件改进和强大的企业级服务器提供了2倍到3倍于以往的吞吐量.
    得到改善的性能表现使得Windows能够在高端市场上成功地与对手展开竞争.

    http://www.spirentcom.com/documents/atp/CCID-magazine_article-622.pdf
    本次评测参考赛迪评测《服务器测试规范》对至强服务器的功能及性能进行考评.在评
    测服务器的功能时,在列出各款服务器的物理配置和管理配置的基础上对服务器的可靠性,
    可用性,可扩展性,易用性和可管理性几个方面进行考评.性能测试上,由于Web应用在
    互联网和内部网络应用中占据非常重要的地位,本次主要对至强服务器的Web性能进行了
    考察.

    小哨兵教育VOD系统解决方案
    服务器数量:1台。承载web服务和提供视频服务的IIS服务。

    主要配置:
    CPU:  2个Intel Xeon 3.0GHz 处理器(标配 1个);
    内存:  2048MB (标配);

    硬盘: 根据所需存储的资料大小决定硬盘大小。必须使用RAID-5和SCSI硬盘,否则硬盘I/O数据带宽和系统可靠性将不能满足要求;

    网卡:千兆出口;如果是小于200并发的百兆交互即可。

    WebVOD6.0 通过基于各网段的K级测试
    WEB+数据库服务器

        INTEL XEON 2.8G双CPU、2GB内存、1000M网卡、73GB×2 SCSI硬盘RAID1。

        参与测试的服务器都完整的完成了测试的全程,最高并发数量达到了约五千九百并发。

        在html文件引入其它html文件的几种方法
    简介:在论坛中常常有网友问到,可以在一个html的文件当中读取另一个html文件的内容吗?答案是确定的,而且方法不只一种,在以前我只会使用iframe来引用,后来发现了另外的几种方法,那今天就总结这几种方法让大家参考一下,本人觉得第三种方式较好!
    1.IFrame引入,看看下面的代码

    [代码] <IFRAME NAME="content_frame" width=100% height=30 marginwidth=0 marginheight=0 SRC="import.htm" ></IFRAME>

    你会看到一个外部引入的文件,但会发现有一个类似外框的东西将其包围,可使用
    [代码] <iframe name="content_frame" marginwidth=0 marginheight=0 width= 100% height=30 src="import.htm" frameborder=0></iframe>

    但你会发现还会有点问题,就是背景色不同,你只要在引入的文件import.htm中使用相同的背景色也可以,但如果你使用的是IE5.5的话,可以看看这篇关于透明色的文章 如果想引入的文件过长时不出现滚动条的话在import.htm中的body中加入scroll=no

    2.<object>方式

    [代码] <object style="border:0px" type="text/x-scriptlet" data="import.htm" width=100% height=30></object>
    <object style=\’border: 0px\’ type=\’text/x-scriptlet\’ data=\’http://www.west163.net\’ width=760 Height=400></object>

    3.Behavior的download方式

    [代码]
    <span id=showImport></span>
    <IE:Download ID="oDownload" STYLE="behavior:url(#default#download)" />
    <script>
    function onDownloadDone(downDate)&leftsign;
    showImport.innerHTML=downDate
    &rightsign;
    oDownload.startDownload(\’import.htm\’,onDownloadDone)
    </script> 

    今天写代码给DropDownList1添加DropDownList1_SelectedIndexChanged事件,在运行测试时发现DropDownList1的index发生改变后DropDownList1_SelectedIndexChanged没有执行,查了一下DropDownList1的属性才知道AutoPostBack要设置成true,才会执行DropDownList1_SelectedIndexChanged事件.呵呵…原来AutoPostBack属性的解释是:"当选定内容更改后,自动回发到服务器",当AutoPostBack的属性为false时系统不会自动回发到服务器,自然DropDownList1_SelectedIndexChanged也不会执行.

    select isnull(t1.name,t2.name) as name ,t1.quan as gs,t2.quan as hn
    from sort_gs t1 full join sort_hn t2
    on t1.name = t2.name

    用 LEFT JOIN 运算 创建左边外部联接.左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

    用RIGHT JOIN 运算 创建 右边外部联接.右边外部联接将包含了从第二个(右边)开始的两个表中的全部记录,即使在第一个(左边)表中并没有匹配值的记录。

    例如,可以使用 LEFT JOIN 与部门(左边)及员工(右边)表来选择所有的部门,包含了没有分配到员工的部门。可以使用 RIGHT JOIN 选择所有的员工,包含了没有分配到部门的员工。

    下列示例显示如何在类标识符字段中联接类表及产品表。查询将会列出所有种类的列表,包含那些没有产品在其中的种类:

    SELECT CategoryName,

    ProductName

    FROM Categories LEFT JOIN Products

    ON Categories.CategoryID = Products.CategoryID;

      
    4月13日
    asp.net中组件和数据的绑定
    在net中会碰到很多组件和数据绑定的情况,最常见的就是DropDownList组件。
    ?
    DropDownList如何绑定数据的关键要点:
    首先连接数据库,将数据放在dateSet中,然后使用以下方法完成
    .DataSource(设置数据源).DataTextField(设置每个list的文本)
    .DataValueField(设置敏个list的值).SelectedValue(选择默认项)
    .DataBind()(执行)
    ?
    CheckBoxList如何绑定数据的关键要点:
    与DropDownList所使用的方法一致,但如果它要再从另一个表中读出选中的数据的话,则要加一个循环的方法
    For i = 0 To Ds.Tables("TableName").Rows.Count – 1
    ??? CheckBoxList.Items(Ds.Tables("int2").Rows(i).Item(1) – 1).Selected = True
    Next
    将选择项设置上去。

    <%@ Page Language="C#" AutoEventWireup="True" %>
    <Script language="C#" runat="server">
    void Page_Load(Object Sender,EventArgs e)&leftsign;
     ArrayList array=new ArrayList();
     array.Add("Windows");
     array.Add("Linux");
     array.Add("unix");
     CheckBox_1.DataSource=array;
     CheckBox_1.DataBind();
     RadioList_1.DataSource=array;
     RadioList_1.DataBind();
    &rightsign;
    </Script>
    <form id="Form_1" runat="server">
    <asp:checkboxList ID="CheckBox_1" runat="server"/>
    <input id="Button_1" type="Button" value="CheckButton" runat="server"/>
    <asp:radiobuttonlist ID="RadioList_1" runat="server"/>
    <input id="Button_2" type="Button" value="RadioButton" runat="server"/>
    </form>

    怎么让 DataGrid 在没有数据的情况下也显示表头啊!?

    方法1:
    返回无数据行的DataGrid 就可以了。
    直接 Return returnDataSet 就可以了

    方法2:
    Dim returnDataSet As DataSet
    returnDataSet = ……

    If (returnDataSet.Tables(0).Rows.Count > 0) Then
        Return returnDataSet
    Else
        Return Nothing
    End If

    var   pathName=document.location.pathname; 
      var   fileName=pathName.substring(pathName.lastIndexOf(\’/\’)+1);

    \’<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="425" height="350">   <param name="movie" value="./media/welcome.swf" />        <param name="quality" value="high" />        <embed src="./media/welcome.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="425" height="350"></embed>    </object>\’;

    下面这个就是没有办法在IE6显示
    <object width="425" height="350"><param name="movie" value="./media/welcome.swf"></param><param name="wmode" value="transparent"></param><embed src="./media/welcome.swf" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>

    标签:, ,
    20071220 sql2005 游标 cursor  rand - 十月 11, 2008 by yippee

    20071220 sql2005 游标 cursor  rand
    http://www.yippeesoft.com

    declare   @stockmount  float
    declare authors_cur cursor
    for
    select stockmount from foodsinfo$
    for update of stockmount
    open authors_cur /* open then cursor */
    fetch next from authors_cur into @stockmount
    while @@fetch_status = 0 /* loop the rows in the cursor */
    begin
    update foodsinfo$
    set stockmount = cast(ceiling(rand() * 200) as int)
    where current of authors_cur
    /* get next row */
    fetch next from authors_cur into @stockmount
    end
    deallocate authors_cur /* close the cursor */

    例:下面是一个完整的定位更新的例子。
     declare @au_id int ( 11 ), @au_lname varchar ( 40 ), @au_fname varchar ( 20 )
     declare authors_cur cursor
     for
     select au_id,au_lname,au_fname from authors
     for update of au_id,aulname,au_fname
      open authors_cur /* open then cursor */
     fetch next from authors_cer into @au_id , @au_lname , @au_fname
      while @@fetch_status = 0 /* loop the rows in the cursor */
     begin
     if @au_id = \’ 172-32-1176 \’
     update authors
     set au_lname = \’ smith \’ ,au_fname = \’ jake \’
     where current of authors_cur
      /* get next row */
     fetch next from authors_cer into @au_id , @au_lname , @au_fname
     end
      deallocate authors_cur /* close the cursor */

     四、释放游标
     1 .关闭游标
     使用close命令关闭游标,在处理完游标中数据之后,发布关闭游标来释放数据结果集和定位于数据记录上的锁,close语句关闭游标但不释放游标占用的数据结构。如果准备在随后的使用中再次打开游标,则应使用open命令。
     语法: close 游标名称
     2 .释放游标
     在使用游标时各种针对游标的操作或者引用游标各或者引用指向游标的游标变量,当close命令关闭游标时并没有释放游标占用的数据结构。因此常使用deallocate命令删除掉游标与游标名或游标变量之间的联系,并且释放游标占用的所有系统资源。
     语法: deallocate 游标名称

    declare       @UserID       int 
    declare       cur_getUserID       cursor       for 
                select       [id]       from       user       where       flag=0 
    open       cur_getUserID 
    fetch       next       from       cur_getUserID       into       @UserID     
    while(@@fetch_status       =       0) 
    begin 

    print       @UserID               –执行结果每次打印都是同一个ID 
    update       [user]       set       flag=-99       where       id=@UserID 
    –其它事务处理 

    fetch       next       from       cur_getUserID       into       @UserID     
    end 
    close     cur_getUserID
    deallocate     cur_getUserID

    WHILE
     
    该条件判断式是设定SQL陈述式或陈述式区块重复执行的条件。只要指定条件为TRUE,陈述式会一直重复执行。这就是所谓的WHILE循环(Loop),因为WHILE结构中的程序代码在循环中重复。语法显示如下:
    WHILEBoolean_expression
    SQL_statement &line; block_of_statements
    [BREAK]SQL_statement &line; block_of_statements
    [CONTINUE]
    同上述的IF…ELSE,使用BEGIN和END来指定WHILE循环中陈述式的起始和结束。BREAK关键词则将导致从WHILE循环中跳出,然后接着执行WHILE循环结束后的陈述式。如果一个WHILE循环与另一个WHILE循环是巢状结构,BREAK关键词只会从被包含的WHILE循环中跳出,继续执行该循环外所有的的陈述式和循环。CONTINUE关键词指定WHILE循环重新执行BEGIN和END之间的陈述式,忽略CONTINUE之后的其它陈述式。
    现在使用简单的WHILE循环重复执行UPDATE陈述式。WHILE循环的检测条件为:royalty资料行的平均值是否少于20。如果检测传回TRUE,所有royalty数据列的值都会增加5%。接着再次检测WHILE条件,重复更新直到royalty字段的平均值为20或更多。程序代码如下:
    WHILE (SELECT AVG(royalty) FROM roysched) < 20
    UPDATE roysched SET royalty = royalty * 1.05
    GO
    由于royalty数据行原来的平均值是15,因此在平均值达到20前,WHILE循环共执行了21次,直到检测条件回传值为FALSE时才停止。
    现在看一个在WHILE循环中使用BREAK、CONTINUE、BEGIN和END的范例。我们将执行循环直到royalty的平均值达到25。但如果在循环中,royalty的最大值超过27,将中断循环,并在WHILE循环结束后加一个SELECT陈述式。下面是T-SQL程序代码:
    WHILE (SELECT AVG(royalty) FROM roysched) < 25
    BEGIN
    UPDATE roysched SET royalty = royalty * 1.05
    IF (SELECT MAX(royalty) FROM roysched) > 27
    BREAK
    ELSE
    CONTINUE
    END
    SELECT MAX(royalty) AS "MAX royalty" FROM roysched
    GO
    数据表中已经存在的royalty值大于27,因此只执行一次循环,而royalty的平均值小于25%,因此UPDATE执行一次;接着IF陈述式检测并传回TRUE,所以执行BREAK,跳出WHILE循环;最后执行END关键词后的陈述式,也就是SELECT陈述式。
    您还能使用巢状的WHILE循环,但记得BREAK或CONTINUE关键词只应用于呼叫它们的循环,而不是外部的WHILE循环。

    declare @i int
    set @i=1
    while @i<30
    begin
       insert into test (userid) values(@i)
       set @i=@i+1
    end

     MSSQL中的随机函数

    随机函数:rand()
    在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数。那就看下面的两种随机取整数的方法:

    1、
    A:select  floor(rand()*N)  —生成的数是这样的:12.0
    B:select cast( floor(rand()*N) as int)  —生成的数是这样的:12

    2、
    A:select ceiling(rand() * N)  —生成的数是这样的:12.0
    B:select cast(ceiling(rand() * N) as int)  —生成的数是这样的:12

        其中里面的N是一个你指定的整数,如100,可以看出,两种方法的A方法是带有.0这个的小数的,而B方法就是真正的整数了。
        大致一看,这两种方法没什么区别,真的没区别?其实是有一点的,那就是他们的生成随机数的范围:
    方法1的数字范围:0至N-1之间,如cast( floor(rand()*100) as int)就会生成0至99之间任一整数
    方法2的数字范围:1至N之间,如cast(ceiling(rand() * 100) as int)就会生成1至100之间任一整数
    对于这个区别,看SQL的联机帮助就知了:
    ————————————————————————————
    比较 CEILING 和 FLOOR

    CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如,对于数字表达式 12.9273,CEILING 将返回 13,FLOOR 将返回 12。FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。
    ———————————————————————————-

    标签:, ,
    20071214 sql 2005 导入 xls - 十月 2, 2008 by yippee

    20071214 sql 2005 导入 xls
    http://www.yippeesoft.com

    搞了半天,直接登录到服务器,然后使用导入搞定
    ~~~~~~~~~~~~~~~

    消息 15281,级别 16,状态 1,第 1 行
    SQL Server 阻止了对组件 \’Ad Hoc Distributed Queries\’ 的 STATEMENT\’OpenRowset/OpenDatasource\’ 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 \’Ad Hoc Distributed Queries\’。有关启用 \’Ad Hoc Distributed Queries\’ 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
    http://support.microsoft.com/kb/321686

    配置选项 \’show advanced options\’ 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。
    配置选项 \’Ad Hoc Distributed Queries\’ 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。
    链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 返回了消息 "找不到可安装的 ISAM。"。
    消息 7303,级别 16,状态 1,第 2 行
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 的数据源对象。
    配置选项 \’Ad Hoc Distributed Queries\’ 已从 1 更改为 0。请运行 RECONFIGURE 语句进行安装。
    配置选项 \’show advanced options\’ 已从 1 更改为 0。请运行 RECONFIGURE 语句进行安装。

    启用Ad Hoc Distributed Queries:
    exec sp_configure \’show advanced options\’,1
    reconfigure
    exec sp_configure \’Ad Hoc Distributed Queries\’,1
    reconfigure
    关闭Ad Hoc Distributed Queries:
    exec sp_configure \’Ad Hoc Distributed Queries\’,0
    reconfigure
    exec sp_configure \’show advanced options\’,0
    reconfigure

    配置选项 \’show advanced options\’ 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。
    配置选项 \’Ad Hoc Distributed Queries\’ 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。
    消息 7314,级别 16,状态 1,第 2 行
    链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 不包含表 "sheet1$"。该表不存在,或者当前用户没有访问该表的权限。
    配置选项 \’Ad Hoc Distributed Queries\’ 已从 1 更改为 0。请运行 RECONFIGURE 语句进行安装。
    配置选项 \’show advanced options\’ 已从 1 更改为 0。请运行 RECONFIGURE 语句进行安装。

    SQL   SERVER   与ACCESS、EXCEL的数据转换

    熟悉SQL   SERVER   2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact-SQL语句进行导入导出操作。在 Transact-SQL语句中,我们主要使用OpenDataSource函数、OPENROWSET   函数,关于函数的详细说明,请参考SQL联机帮助。利用下述方法,可以十分容易地实现SQL   SERVER、ACCESS、EXCEL数据转换,详细说明如下:

    一、SQL   SERVER   和ACCESS的数据导入导出

    常规的数据导入导出:

    使用DTS向导迁移你的Access数据到SQL   Server,你可以使用这些步骤: 

    1在SQL   SERVER企业管理器中的Tools(工具)菜单上,选择Data   Transformation 
    2Services(数据转换服务),然后选择     czdImport   Data(导入数据)。 
    3在Choose   a   Data   Source(选择数据源)对话框中选择Microsoft   Access   as   the   Source,然后键入你的.mdb数据库(.mdb文件扩展名)的文件名或通过浏览寻找该文件。 
    4在Choose   a   Destination(选择目标)对话框中,选择Microsoft   OLE DB   Prov   ider   for   SQL Server,选择数据库服务器,然后单击必要的验证方式。 
    5在Specify   Table   Copy(指定表格复制)或Query(查询)对话框中,单击Copy   tables(复制表格)。 
    6在Select   Source   Tables(选择源表格)对话框中,单击Select   All(全部选定)。下一步,完成。

    Transact-SQL语句进行导入导出:

    1.在SQL   SERVER里查询access数据:
    –   ======================================================
    SELECT   * 
    FROM   OpenDataSource(   \’Microsoft.Jet.OLEDB.4.0\’,
    \’Data   Source="c:\\DB.mdb";User   ID=Admin;Password=\’)…表名
    ————————————————————————————————-
    2.将access导入SQL   server 
    –   ======================================================
    在SQL   SERVER   里运行:
    SELECT   *
    INTO   newtable
    FROM   OPENDATASOURCE   (\’Microsoft.Jet.OLEDB.4.0\’, 
                \’Data   Source="c:\\DB.mdb";User   ID=Admin;Password=\’   )…表名
    ————————————————————————————————-
    3.将SQL   SERVER表里的数据插入到Access表中
    –   ======================================================
    在SQL   SERVER   里运行:
    insert   into   OpenDataSource(   \’Microsoft.Jet.OLEDB.4.0\’,
        \’Data   Source="   c:\\DB.mdb";User   ID=Admin;Password=\’)…表名 
    (列名1,列名2)
    select   列名1,列名2     from     sql表
    实例:
    insert   into     OPENROWSET(\’Microsoft.Jet.OLEDB.4.0\’, 
          \’C:\\db.mdb\’;\’admin\’;\’\',   Test) 
    select   id,name   from   Test
    INSERT   INTO   OPENROWSET(\’Microsoft.Jet.OLEDB.4.0\’,   \’c:\\trade.mdb\’;   \’admin\’;   \’\',   表名)
    SELECT   *
    FROM   sqltablename
    ————————————————————————————————-

    二、SQL   SERVER   和EXCEL的数据导入导出
    1、在SQL   SERVER里查询Excel数据:
    –   ======================================================
    SELECT   * 
    FROM   OpenDataSource(   \’Microsoft.Jet.OLEDB.4.0\’,
    \’Data   Source="c:\\book1.xls";User   ID=Admin;Password=;Extended   properties=Excel   5.0\’)…[Sheet1$]
    下面是个查询的示例,它通过用于   Jet   的   OLE   DB   提供程序查询   Excel   电子表格。
    SELECT   * 
    FROM   OpenDataSource   (   \’Microsoft.Jet.OLEDB.4.0\’,
        \’Data   Source="c:\\Finance\\account.xls";User   ID=Admin;Password=;Extended   properties=Excel   5.0\’)…xactions
    ————————————————————————————————-

    2、将Excel的数据导入SQL   server   :
    –   ======================================================
    SELECT   *   into   newtable
    FROM   OpenDataSource(   \’Microsoft.Jet.OLEDB.4.0\’,
        \’Data   Source="c:\\book1.xls";User   ID=Admin;Password=;Extended   properties=Excel   5.0\’)…[Sheet1$]
    实例:
    SELECT   *   into   newtable
    FROM   OpenDataSource(   \’Microsoft.Jet.OLEDB.4.0\’,
        \’Data   Source="c:\\Finance\\account.xls";User   ID=Admin;Password=;Extended   properties=Excel   5.0\’)…xactions
    ————————————————————————————————-

    3、将SQL   SERVER中查询到的数据导成一个Excel文件
    –   ======================================================
    T-SQL代码:
    EXEC   master..xp_cmdshell   \’bcp   库名.dbo.表名out   c:\\Temp.xls   -c   -q   -S"servername"   -U"sa"   -P""\’
    参数:S   是SQL服务器名;U是用户;P是密码
    说明:还可以导出文本文件等多种格式
    实例:EXEC   master..xp_cmdshell   \’bcp   saletesttmp.dbo.CusAccount   out   c:\\temp1.xls   -c   -q   -S"pmserver"   -U"sa"   -P"sa"\’
    EXEC   master..xp_cmdshell   \’bcp   "SELECT   au_fname,   au_lname   FROM   pubs..authors   ORDER   BY   au_lname"   queryout   C:\\   authors.xls   -c   -Sservername   -Usa   -Ppassword\’
    在VB6中应用ADO导出EXCEL文件代码: 
    Dim   cn     As   New   ADODB.Connection
    cn.open   "Driver=&leftsign;SQL   Server&rightsign;;Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"
    cn.execute   "master..xp_cmdshell   \’bcp   "SELECT   col1,   col2   FROM   库名.dbo.表名"   queryout   E:\\DT.xls   -c   -Sservername   -Usa   -Ppassword\’"
    ————————————————————————————————

    4、在SQL   SERVER里往Excel插入数据:
    –   ======================================================
    insert   into   OpenDataSource(   \’Microsoft.Jet.OLEDB.4.0\’,
    \’Data   Source="c:\\Temp.xls";User   ID=Admin;Password=;Extended   properties=Excel   5.0\’)…table1   (A1,A2,A3)   values   (1,2,3)

    T-SQL代码:
    INSERT   INTO   
    OPENDATASOURCE(\’Microsoft.JET.OLEDB.4.0\’,   
    \’Extended   Properties=Excel   8.0;Data   source=C:\\training\\inventur.xls\’)…[Filiale1$]   
    (bestand,   produkt)   VALUES   (20,   \’Test\’)   
    ————————————————————————————————-

    标签: