[原创]修改了web.config的数据库连接字符串端口

mikel阅读(1933)

需要修改web.config的数据库连接字符串端口,原以为直接IP地址加“:”然后端口号,就搞定了,可是怎么也连接不上,原来是需要写成Server=IP地址,端口号的格式,于是又去博客园搜了下相关文章,发现设置数据库连接还有很多参数,引用如下:

先来看一下默认的连接SQL Server数据库配置
<connectionStrings>
<add name=”LocalSQLServer” connectionString=”Data Source=.\SQLExpress;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true” providerName=”System.Data.SqlClient” />
</connectionStrings>

SqlConnectionStringBuilder实例化时需要使用connectionString。 如:SqlConnectionStringBuild builder = new SqlConnectionStringBuild(connectionString);
一、Data Source
SqlConnectionStringBuilder的DataSource属性,对应 connectionString中的Data Source,“Data Source”可以由下列字符串代替:“Server”,“Address”,“Addr”和“Network Address”。
Data Source=.\SQLExpress也可以写成这样Data Source=(local)\SQLExpress。

二、Integrated Security
SqlConnectionStringBuilder 的 IntegratedSecurity 属性,对应 connectionString 中的I ntegrated Security,“Integrated Security”可以写成“trusted_connection”。
为 True 时,使用当前的 Windows 帐户凭据进行身份验证,为 False 时,需要在连接中指定用户 ID 和密码。可识别的值为 True、False、Yes、No 以及与 True 等效的 SSPI。
如果没有些则必须写上 uid=sa;pwd=123 之类的设置“uid”也可使用“User ID”,“pwd”也可换为“PassWord”。

SSPI:Microsoft安全支持提供器接口(SSPI)是定义得较全面的公用API,用来获得验证、信息完整性、信息隐私等集成安全服务,以及用于所有分布式应用程序协议的安全方面的服务。
应用程序协议设计者能够利用该接口获得不同的安全性服务而不必修改协议本身。

三、AttachDBFilename
SqlConnectionStringBuilder 的 AttachDBFilename 属性,对应 connectionString 中的 AttachDBFilename,“AttachDBFilename”可以写成“extended properties”,“initial file name”。
AttachDbFileName 属性指定连接打开的时候动态附加到服务器上的数据库文件的位置。
这个属性可以接受数据库的完整路径和相对路径(例如使用|DataDirectory|语法),在运行时这个路径会被应用程序的 App_Data 目录所代替。

四、User Instance
SqlConnectionStringBuilder 的 UserInstance 属性,对应 connectionString 中的 User Instance ,该值指示是否将连接从默认的 SQL Server 实例重定向到在调用方帐户之下运行并且在运行时启动的实例。
UserInstance=true 时,SQLServerExpress 为了把数据库附加到新的实例,建立一个新的进程,在打开连接的用户身份下运行。
ASP.NET 应用程序中,这个用户是本地的 ASPNET 帐号或默认的 NetworkService,这依赖于操作系统。
为了安全地附加非系统管理员帐号(例如ASP.NET帐号)提供的数据库文件,建立一个独立的 SQLServer 用户实例是必要的。

五、Initial Catalog 等同于 Database。

六、providerName 指定值“System.Data.OracleClient”,该值指定 ASP.NET 在使用此连接字符串进行连接时应使用 ADO.NET System.Data.OracleClient 提供程序。
PS:
DataDirectory是什么?

asp.net 2.0有一个特殊目录app_data,通常Sql Server 2005 express数据文件就放在这个目录,相应的数据库连接串就是:
connectionString=”…… data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|data.mdf;User Instance=true”
这里有一个DataDirectory的宏,它表示什么意义呢?

DataDirectory是表示数据库路径的替换字符串。由于无需对完整路径进行硬编码,DataDirectory 简化了项目的共享和应用程序的部署。例如,无需使用以下连接字符串:
“Data Source= c:\program files\MyApp\app_data\Mydb.mdf”
通过使用|DataDirectory|(包含在如下所示的竖线中),即可具有以下连接字符串:
“Data Source = |DataDirectory|\Mydb.mdf” 。

不仅仅是Sql server 2005 express中使用,也可以在其它的文件数据库中使用,例如Sqllite数据库文件的连接字符串:

<add name=”DefaultDB”
connectionString=”DriverClass=NHibernate.Driver.SQLite20Driver;Dialect=NHibernate.Dialect.SQLiteDialect;Data Source=|DataDirectory|\data.db3″ />

—————————————    附加一些连接语句例子    —————————————

<–普通例子1–>
<configuration>
<connectionStrings>
<add name=”Sales” providerName=”System.Data.SqlClient” connectionString=”server=myserver;database=Products;uid=salesUser;pwd=sellMoreProducts” />

<add name=”NorthWind” providerName=”System.Data.SqlClient” connectionString=”server=.;database=NorthWind;Integrated Security=SSPI” />

</connectionStrings>
</configuration>

<–普通例子2–>
<configuration>
<connectionStrings>
<add name=”NorthWind” connectionString=”Provider=SQLOLEDB;Integrated Security=SSPI;Initial Catalog=da;Data Source=bar” />
</configuration>

———————————————————————————————————-

<connectionStrings>
<add name=”LocalSqlServer” connectionString=”Data Source=.\SQLExpress;Initial Catalog=NorthWind;Integrated Security=SSPI” providerName=”System.Data.SqlClient” />
</connectionStrings>
<–也可写为–>
<connectionStrings>
<add name=”LocalSqlServer” connectionString=”Server=.\SQLExpress;Database=NorthWind;Integrated Security=Yes” providerName=”System.Data.SqlClient” />
</connectionStrings>

———————————————————————————————————-

<configuration>
<connectionStrings>
<add name=”DB2005_2″
providerName=”System.Data.SqlClient”
connectionString=”Data Source=.;Initial Catalog=Northwind;User ID=dbtester;Password=zhi;Trusted_Connection=False;Connect Timeout=30;Min Pool Size=16;Max Pool Size=100″/>

<add name=”DB2005_1″
providerName=”System.Data.SqlClient”
connectionString=”Server=.;Database=Northwind;User ID=dbtester;Password=zhi;Trusted_Connection=False;Connect Timeout=30;Min Pool Size=16;Max Pool Size=100″/>

<add name=”Northword2000″
providerName=”System.Data.SqlClient”
connectionString=”Initial Catalog=Northwind;User ID=dbtester;PassWord=zhi;Persist Security Info=false;Data Source=(local);Connect Timeout=30;Min Pool Size=16;Max Pool Size=100;”/>

<add name=”SQLExp”
providerName=”System.Data.SqlClient”
connectionString=”Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\northwnd1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True”/>

<add name=”Oracle”
connectionString=”Data Source=TEST;User ID=sa;Password=sa;”
providerName=”System.Data.OracleClient” />

<add name=”oleconn”
providerName=”System.Data.OleDb”
connectionString=”Provider=Microsoft.Jet.OleDb.4.0;Data Source=|DataDirectory|northwind.mdb”/>

<add name=”MySql”
providerName=”MySql.Data.MySqlClient”
connectionString=”Server=172.29.131.27;Port=3311;DataBase=comctl;Persist Security Info=False;User ID=root;Password=123456;Allow Zero Datetime=true;” />
</connectionStrings>
<system.data>
<DbProviderFactories>
<add name=”MySQL Data Provider”
invariant=”MySql.Data.MySqlClient”
description=”.Net Framework Data Provider for MySQL”
type=”MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=5.2.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”/>
</DbProviderFactories>
</system.data>
</configuration>

======================================      可以保存为(以下转自他处).cs      ======================================

using System.Data.SqlClient;
using System.Configuration;
public class Class1
{
public Class1()
{
//Persist Security Info如果数据库连接成功后不再需要连接的密码,建议False
//string sql2000 = “Initial Catalog=Northwind;User ID=dbtester;PassWord=zhi;Persist Security Info=false;Data Source=(local);Connect Timeout=30;Min Pool Size=16;Max Pool Size=100;”;
//string sql2000 = “Initial Catalog=Northwind;User ID=sa;PassWord=5;Persist Security Info=false;Data Source=.”;
//string sql2000 = “Initial Catalog=Northwind;User ID=sa;PassWord=5;Persist Security Info=false;Data Source=newtime”;
string source = “server=(local);integrated security=SSPI;database=Northwind”;
string expressSource = @”Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\northwnd.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True”;
//Integrated Security采用windows的集成身份验证,integraged   Security=SSPI;
//Integrated Security=SSPI 这个表示以当前WINDOWS系统用户身去登录SQL SERVER服务器,如果SQL SERVER服务器不支持这种方式登录时,就会出错
//表示你的连接安全验证方式,可用trusted_connection=yes取代
//Integrated Security 为 True。用户实例仅与集成安全性一起使用,带有用户名和密码的 SQL Server 用户不起作用。
//string source3 = @”Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog= pubs;UserID=sa;Password=asdasd;”;
//(DBMSSOCN=TCP/IP instead of Named Pipes, at the end of the Data Source is the port to use (1433 is the default))
//Standard Security:
string source4 = “Data Source=Aron1;Initial Catalog= pubs;UserId=sa;Password=asdasd;”;
string source5 = “Server=Aron1;Database=pubs;UserID=sa;Password=asdasd;Trusted_Connection=False”;
//Trusted_Connection ‘false’ 当为 false 时,将在连接中指定用户 ID 和密码。当为 true 时,将使用当前的 Windows 帐户凭据进行身份验证。
//可识别的值为 true、false、yes、no 以及与 true 等效的 sspi(强烈推荐)。所以一定要设置Trusted_Connection= false,以防被别人”登录”、”注入语句”等
string source6 = “Data Source=Aron1;Initial Catalog=pubs;Integrated Security=SSPI;”;
string source7 = “Server=Aron1;Database=pubs;Trusted_Connection=True;”;
//(use serverName\instanceName as Data Source to use an specifik SQLServer instance, only SQLServer2000)
//Integrated   Security或Trusted_Connection   ‘false’   当为   false   时,
//将在连接中指定用户   ID   和密码。当为   true   时,将使用当前的   Windows   帐户凭据进行身份验证
//VS2003:string connStr=System.Configuration.ConfigurationSettings.AppSettings[“SQLCONNECTIONSTRING”];2003中用的
//VS2005:string connStr=System.Configuration.ConfigurationManager.ConnectionStrings[“SQLCONNECTIONSTRING”].ToString(); 2005-8中用
System.Configuration.ConnectionStringSettings i = System.Configuration.ConfigurationManager.ConnectionStrings[“Northword2000”];
}
}

[转载]利用Attribute简化SQL删除操作

mikel阅读(1248)

[转载]利用Attribute简化SQL删除操作 – ahl5esoft – 博客园.

昨天跟朋友聊天,发现他们的项目数据层使用的是最基础的纯SQL语句+SQLParameter进行数据交互的,大家知道SELECT、UPDATE、CREATE对于表的依赖性比较大,然后删除语句却不一样,它的语法比较简单,大致有以下几种:

1、DELETE FROM TableName

2、DELETE FROM TableName WHERE ID = idValue

3、DELETE FROM TableName WHERE ID IN (id1, id2, id3, id4….)

于是我们要实现这个简单的功能来简化比较常用的删除就比较容易了,主要保留2个数据,1个是TableName,另外1个就是ID了,如果实体 类有基类的情况下,我们可以扩展基类,提供2个接口,让其他的实体类去实现来保存对应的TableName和ID。但是如果没有基类的话,我们也可以利用 Attribute来实现这个功能。

Attribute代码如下:

 1 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
 2 public class DbAttribute : Attribute
 3 {
 4     #region 变量
 5 
 6     private string m_TableName = null;
 7 
 8     private string m_PrimaryKey = null;
 9 
10     #endregion
11 
12     #region 构造函数
13 
14     public DbAttribute(string tableName, string primaryKey)
15     {
16         this.m_TableName = tableName;
17         this.m_PrimaryKey = primaryKey;
18     }
19 
20     #endregion
21 
22     #region 普通方法
23 
24     public string GetDeleteAllSQL()
25     {
26         return string.Format(@"
27             DELETE
28             FROM
29                 {0}", this.m_TableName);
30     }
31 
32     /// <summary>
33     /// 获取根据主键删除表数据
34     /// </summary>
35     /// <typeparam name="TParam">数据库类型</typeparam>
36     /// <typeparam name="TPKValue">主键类型名</typeparam>
37     /// <param name="tPKValue">主键值</param>
38     /// <returns></returns>
39     public KeyValuePair<string, TParam[]> GetDeleteByPrimaryKeySQL<TParam, TPKValue>(TPKValue tPKValue)
40         where TParam : DbParameter, new()
41     {
42         var sql = string.Concat(this.GetDeleteAllSQL(), string.Format(@"
43             WHERE
44                 {0} = :_pk_", this.m_PrimaryKey));
45         MarkParameter<TParam> markParameter = new MarkParameter<TParam>();
46         var arrDbParam = markParameter.CastMark(ref sql, new Hashtable
47         {
48             {"_pk_", tPKValue}
49         });
50         return new KeyValuePair<string, TParam[]>(sql, arrDbParam);
51     }
52 
53     /// <summary>
54     /// 获取根据主键数组删除表数据
55     /// </summary>
56     /// <typeparam name="TParam"></typeparam>
57     /// <typeparam name="TPKValue"></typeparam>
58     /// <param name="arrTPKValue"></param>
59     /// <returns></returns>
60     public KeyValuePair<string, TParam[]> GetDeleteInPrimaryKeySQL<TParam, TPKValue>(params TPKValue[] arrTPKValue)
61         where TParam : DbParameter, new()
62     {
63         var sql = string.Concat(this.GetDeleteAllSQL(), string.Format(@"
64             WHERE
65                 {0} IN (:_arr_pk_)", this.m_PrimaryKey));
66         MarkParameter<TParam> markParameter = new MarkParameter<TParam>();
67         var arrDbParam = markParameter.CastMark(ref sql, new Hashtable
68         {
69             {"_arr_pk_", arrTPKValue}
70         });
71         return new KeyValuePair<string, TParam[]>(sql, arrDbParam);
72     }
73 
74     #endregion
75 }

以上用到泛型模式以及前几篇文章提到的替换参数的方法,文章在此。有了以上的Attribute,我们就可以用它来标记实体类了,代码如下:

1 [Db("Permission_Info", "p_id")]
2 public partial class Permission
3 {
4     //属性、方法等
5 }

为了演示,我写了一个用来调用的方法,来测试产生的语句和参数。测试类代码如下:

 1 public class DbOperate
 2 {
 3     public static string GetDeleteSQL<TClass>() where TClass : new()
 4     {
 5         var attr = GetAttribute<TClass>();
 6         var sql = string.Empty;
 7         if (null != attr)
 8         {
 9             sql = attr.GetDeleteAllSQL();
10         }
11         return sql;
12     }
13 
14     public static KeyValuePair<string, SqlParameter[]> GetDeleteByIdSQL<TClass, TPKValUe>(params TPKValUe[] arrTPKValue) where TClass : new()
15     {
16         var attr = GetAttribute<TClass>();
17         KeyValuePair<string, SqlParameter[]> pair = new KeyValuePair<string, SqlParameter[]>(null, null);
18         if (null != attr)
19         {
20             if (1 == arrTPKValue.Length)
21             {
22                 pair = attr.GetDeleteByPrimaryKeySQL<SqlParameter, TPKValUe>(arrTPKValue[0]);
23             }
24             else
25             {
26                 pair = attr.GetDeleteInPrimaryKeySQL<SqlParameter, TPKValUe>(arrTPKValue);
27             }
28         }
29         return pair;
30     }
31 
32     static DbAttribute GetAttribute<T>() where T : new()
33     {
34         var arrAttribute = typeof(T).GetCustomAttributes(typeof(DbAttribute), false);
35         DbAttribute attr = null;
36         if (0 < arrAttribute.Length)
37         {
38             attr = arrAttribute[0] as DbAttribute;
39         }
40         return attr;
41     }
42 }

代码测试如下:

以上代码并不是最优的选择,我们仍然可以在Attribute调用的地方进行优化,大家可以参考老赵的《Attribute操作的性能优化方式》

[转载]推荐几个不错的jQuery图表插件

mikel阅读(1191)

[转载]推荐几个不错的jQuery图表插件,让你的报表更清晰动感 – sxwgf – 博客园.

很多时候我们需要在网页中显示数据统计报表,从而能很直观地了解数据的走向,更好地帮助决策分析。今天就给大家分享几个个人觉得好用的JQuery图表插件,这几个图表插件使用起来非常方便,而且挺灵活的,相信大家会喜欢。

jqPlot(中文API说明及示例和源码)推荐

jqPlot是一款基于JQuery类库的图标绘制插件。通过jqPlot可以在网页中绘制线状、柱状、饼状等多种样式图表

Google Chart(中文API详解)

利用Google Chart API可以动态地生成图表图形,例如在地址栏中输入
http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250×100&chl=Hello|World
即可看到生成的报表图片。google好多api都关闭了,chart服务应该目前不会关。

Flot(中文文档)推荐

flot 是一个基于jQuery的开源JavaScript库,是一个纯粹的 jQuery JavaScript 绘图库,可以在客户端即时生成图形,使用非常简单,支持放大缩小以及鼠标追踪等交互功能。

TufteGraph

主要是画柱状图,也是基于jquery的

Sparkline(中文说明)

jQuery Sparklines可以用来生成静态或动态波谱图表效果,其特点是:凸现数据显示,设计简单,能提供文字大小图片。

介绍就到这里,希望对大家有所帮助。

[转载]Android 与web一起工作(Android读取网站特定页面)

mikel阅读(921)

[转载]Android 与web一起工作(Android读取网站特定页面) – wxj200589 – 博客园.

项目设想

网站部分开发一个关于web开发知识的站点,要通过Android来阅读这个模块的内容。

实现

  • 通过手机浏览器直接阅读,优点:不用安装单独的客户端。缺点:会存在一些冗余的信息消耗客户的流量。
  • 通过一个自己网站实现的app,优点:可以针对手机客户端单独设计app,将其他图片和无相关的内容过滤掉,节省客户的流量,缺点:开发成本变大。

现在我们通过技术实现第二种实现方式:自己实现Android客户端。

一 建立自己的站点

将自己的站点的内容发布,更新,删除都放到web互联网上维护,相信有很多收费和不收费的,上网找找就能找到自己满意的。我们这次讲得重点是Android app。

二 新建一个view

这个view很简单,就是一个可以下来查看当前全部的文字内容。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
              android:layout_width="306px" android:layout_height="410px" 
              android:layout_x="7px" android:layout_y="61px"
             android:scrollbars="vertical" android:fadingEdge="vertical"> 
    <TextView
      android:id="@+id/ResultView"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_marginTop="2px"
     android:layout_marginBottom="2px"
     android:layout_marginLeft="2px"
     android:layout_marginRight="2px"
     android:text=""
     android:layout_x="7px"
     android:layout_y="61px"
     >
     </TextView>
</ScrollView>

三 新建一个app工程(InternetActivity)

这次用到的是HttpGet,类似的还可以使用HttpPost.具体代码如下:

public class InternetActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.rdbox);
        TextView rbox=(TextView)findViewById(R.id.ResultView);

        HttpGet post=new HttpGet("http://www.71site.com/");
        try{
        HttpResponse response=new DefaultHttpClient().execute(post);
        if(response.getStatusLine().getStatusCode()==200){
                String result=EntityUtils.toString(response.getEntity());
                result=result.replaceAll("<", "");
                result=result.replaceAll(">", "");
            rbox.setText(result);
        }
        else{
            rbox.setText("code:"+response.getStatusLine().toString());
        }
        }
        catch(Exception ex){
            rbox.setText("error:"+ex.getMessage().toString());
            ex.printStackTrace();
        }

    }

}

运行,发现有错误,不能正常返回内容,查找之后发现,Android的权限很严格,还要在AndroidManifest.xml加入一行代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="qiyesite.android.readbox"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-permission android:name="android.permission.INTERNET" />

记住位置很重要,一定要放到manifest 下的第一级目录。最好上一张运行效果图。

image

[转载]Android SD卡 文件或目录拷贝、复制、粘贴

mikel阅读(1036)

[转载]Android SD卡 文件或目录拷贝、复制、粘贴 – wainiwann – 博客园.

在使用ES文件浏览器的时候,当浏览SD卡下的文件或者其他地方的文件时,如果长按某一 项文件或某一目录时会有”剪切”、”复制”、”重命名”、”删除” 等操作。于是乎自己也想弄一个类似与ES文件浏览器上面的拷贝复制功能。至于做一个类似ES文件浏览器 一样的软件,也是可以做的。

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.copy.file;
/**
* @author wainiwann
* Android SD卡文件目录拷贝操作
*
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import Android.app.Activity;
import Android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class Copy_File extends Activity
{
private Button m_btn = null;
private final static String FROMPATH = "/mnt/sdcard/A/";
private final static String TOPATH = "/mnt/sdcard/B/";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
m_btn = (Button)findViewById(R.id.button1);
m_btn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
if(copy(FROMPATH, TOPATH)==0)
{
Toast.makeText(Copy_File.this,"文件拷贝成功!!!",20000).show();
}else
{
Toast.makeText(Copy_File.this,"文件拷贝失败!!!",20000).show();
}
}
});
}
public int copy(String fromFile, String toFile)
{
//要复制的文件目录
File[] currentFiles;
File root = new File(fromFile);
//如同判断SD卡是否存在或者文件是否存在
//如果不存在则 return出去
if(!root.exists())
{
return -1;
}
//如果存在则获取当前目录下的全部文件 填充数组
currentFiles = root.listFiles();
//目标目录
File targetDir = new File(toFile);
//创建目录
if(!targetDir.exists())
{
targetDir.mkdirs();
}
//遍历要复制该目录下的全部文件
for(int i= 0;i<currentFiles.length;i++)
{
if(currentFiles[i].isDirectory())//如果当前项为子目录 进行递归
{
copy(currentFiles[i].getPath() + "/", toFile + currentFiles[i].getName() + "/");
}else//如果当前项为文件则进行文件拷贝
{
CopySdcardFile(currentFiles[i].getPath(), toFile + currentFiles[i].getName());
}
}
return 0;
}
//文件拷贝
//要复制的目录下的所有非子目录(文件夹)文件拷贝
public int CopySdcardFile(String fromFile, String toFile)
{
try
{
InputStream fosfrom = new FileInputStream(fromFile);
OutputStream fosto = new FileOutputStream(toFile);
byte bt[] = new byte[1024];
int c;
while ((c = fosfrom.read(bt)) > 0)
{
fosto.write(bt, 0, c);
}
fosfrom.close();
fosto.close();
return 0;
} catch (Exception ex)
{
return -1;
}
}
}

下次在写个文件浏览器,然后在获取某一项的长按事件,然后弹出一个Dialog实现文件操作。

[转载]jQuery插件原来如此简单——jQuery插件的机制及实战

mikel阅读(1114)

[转载]jQuery插件原来如此简单——jQuery插件的机制及实战 – artwl – 博客园.

JQuery插件的种类

1、封装对象方法

这种插件是将对象方法封装起来,用于对通过选择器获取的JQuery对象进行操作,是最常见的一种插件。此类插件可以发挥出jQuery选择器 的强大优势,有相当一部分的jQuery的方法,都是在jQuery脚本库内部通过这种形式“插”在内核上的,例如parent()方 法,appendTo()方法等。

2、封装全局函数

可以将独立的函数加到jQuery命名空间下。如常用的jQuery.ajax()方法、去首尾空格的jQuery.trim()方法,都是jQuery内部作为全局函数的插件附加到内核上去的。

3、选择器插件

虽然jQuery的选择器十分强大,但在少数情况下,还是会需要用到选择器插件来扩充一些自己喜欢的选择器。

jQuery插件的机制

jQuery插件的机制很简单,就是利用jQuery提供的jQuery.fn.extend()和jQuery.extend()方法,扩展jQuery的功能。

jQuery.fn.extend()多用于扩展上面提到的3种类型中的第一种,jQuery.extend()用于扩展后两种插件。这两个方法都接受一个参数,类型为Object。Object对象的“名/值对”分别代表“函数或方法名/函数主体”。

编写jQuery插件的一些Tips

1、jQuery插件的文件名推荐命名为jquery.[插件名].js,以免和其他JS库插件混淆。

2、所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身。

3、在插件头部加上一个分号,以免他人的不规范代码给插件带来影响。

4、所有的方法或函数插件,都应当以分号结尾,以免压缩时出现问题

5、除非插件需要返回的是一些需要获取的变量,插件应该返回一个jQuery对象,以保证插件的可链式操作。

6、利于jQuery.extend()方法设置插件方法的默认参数,增加插件的可用性。

jQuery插件结构

jQuery插件结构如下:

;(function($){
    /*这里放插件代码,可以将$作为jQuery的别名*/
})(jQuery);

封装jQuery对象方法插件实战

功能:设置选择的元素的颜色,获取选择的首个元素的颜色

命名:jquery.color.js

结构:

;(function($){
    $.fn.extend({
         //这里写插件代码
    });
})(jQuery);

思路:设置一个参数value,如果调用时传递了value这个参数,就是设置颜色,否则为获取颜色。获取和设置颜色可以用jQuery提供的css方法即可

完整代码:

;(function($){
    $.fn.extend({
        "color":function(value){
            if(value==undefined){
                return this.css("color");
            }
            else{
                return this.css("color",value);
            }
        }
    });
})(jQuery);

由于css()方法在获取颜色时已有取第一个元素的判断,所以这里直接用this.css(“color”)即可。

如果是一组插件,可以用如下写法:

;(function($){
    $.fn.extend({
        "color":function(value){
            //插件代码
        },
        "border":function(value){
            //插件代码
        },
        "background":function(value){
            //插件代码
        }
    });
})(jQuery);

插件测试:

封装全局函数插件实战

功能:单独去除左侧或单独去除右侧的空格

命名:jquery.lrtrim.js

结构:

;(function($){
    $.extend({
        ltrim:function(text){
            //插件代码
        },
        rtrim:function(text){
            //插件代码
        }
    });
})(jQuery);

思路:这类插件是在jQuery命名空间内部添加一个函数,直接用正则表达式即可。

完整代码:

;(function($){
    $.extend({
        ltrim:function(text){
            return (text||"").replace(/^\s+/g,"");
        },
        rtrim:function(text){
            return (text||"").replace(/\s+$/g,"");
        }
    });
})(jQuery);

插件测试:

自定义选择器插件实战

jQuery以其强大的选择器著称,那么jQuery的选择器的工作原理是什么呢?

jQuery的选择解析器首先会使用一组正则表达式来解析选择器,然后针对解析出的每一个选择符执行一个函数,称为选择函数。最后根据这个选择函数的返回值为true还是false来决定是否保留这个元素,这样就可以找到匹配的元素节点。

如$(“div:gl(1)”),该选择器首先会获取所有的<div>元素,然后隐式地遍历这些<div>元素,并逐 个将这些<div>元素作为参数,连同括号里的“1”等一些参数一起传递给gt对应的选择器函数进行判断。如果返回true则保留,否则不保 留,这样得到的结果就是一个符合要求的<div>元素的集合。

选择器的函数一共接受3个参数,形式如下:

function (a,i,m){
         //...
}

第一个参数为a,指的是当前遍历到的DOM元素。

第二个参数为i,指的是当前遍历到的DOM元素的索引值,从0开始。

第三个参数是m,它是由jQuery正则解析引擎进一步解析后的产物,是一个数组:其中最重要的一个是m[3],在$(“div:gl(1)”)中即为括号里的数字“1”。

在jQuery中已经有lt,gt和eq选择器,因此这里写一个介于两者之间(between)的选择器。

功能:选择索引值为a到b之间(a<b,a、b为正整数)的元素

命名:jquery.between.js

结构:

;(function($){
    $.extend($.expr[":"],{
        between:function(a,i,m){
            //插件代码
        }
    });
})(jQuery);

思路:在上面的三个参数中,m[3]为”a,b”的形式,因此把m[3]用”,”分隔,然后跟索引值i进行对比,如果i在m[3]表示的范围之间就返回true,否则为false

完整代码:

;(function($){
    $.extend($.expr[":"],{
        between:function(a,i,m){
            var temp=m[3].split(",");
            return +temp[0]<i&&i<+temp[1];
        }
    });
})(jQuery);

注:这里用+temp[0]、+temp[1]把字符串形式的数字转换成了数字

插件测试:

小结

本文主要介绍了jQuery插件的种类,机制,并针对每种类型进行了实战,希望能对大家有所帮助。本人也是jQuery的初学者,欢迎大家拍砖。

参考书籍:《锋利的jQuery》(人民邮电出版社)

[转载]翻译在没有安装ASP.NET MVC3的服务器上运行ASP.NET MVC3的程序

mikel阅读(1433)

[转载]【翻译】在没有安装ASP.NET MVC3的服务器上运行ASP.NET MVC3的程序-scottgu – liulun – 博客园.

原文地址:

http://weblogs.asp.net/scottgu/archive/2011/01/18/running-an-asp-net-mvc-3-app-on-a-web-server-that-doesn-t-have-asp-net-mvc-3-installed.aspx

为了更符合中文阅读习惯,我对原文做了小幅度修改

最近我们发布了一些新的Web产品 – 包括ASP.NET MVC 3。至今为止,我们已经获得了大量的反馈。

有几个朋友在问我一个问题:“我的网站托管服务提供商目前还不支持ASP.NET MVC 3 – 你知道他们将来什么时候会安装吗?”

好消息是,您不必等他们在Web服务器上安装ASP.NET MVC3。

只要您的网站托管服务提供商支持.NET 4,那么您现在就可以构建和部署ASP.NET MVC3应用程序了

– 不用托管供应商做任何事。

下面的文章介绍如何启用此功能。

一些背景:
我们支持两种方式使您可以使用一台机器上的ASP.NET MVC3组件:
1,在一台机器上,将ASP.NET MVC 3组件安装在一个集中的地方,WEB项目在那里引用这些组件

2,把ASP.NET MVC 3的组件复制到您的Web项目的\bin文件夹下,WEB项目在那里引用这些组件

第一种方法是我们使用Visual Studio中使用的默认方法,

这使得我们可以更容易为ASP.NET MVC 3提供升级服务(当发现BUG的时候)。

第二种方法也是得到了完全支持,没有在服务器上安装ASP.NET MVC3,也可以使用它。

你只要把ASP.NET MVC的组件放在你的WEB程序的bin目录中,然后把整个Web程序拷贝到FTP(WEB服务器)上,它就可以工作了。

如果您的网站托管服务提供商还没有在他们的服务器上安装ASP.NET MVC 3,那么您应该使用第二种方法。

方法1:基于GAC引用ASP.NET MVC组件
当您在计算机上安装ASP.NET MVC 3的时候,

一些组件会自动注册到GAC中(全局程序集缓存)。

GAC提供一个集中的地方供安装和升级(通过Windows更新).NET程序集。

因此ASP.NET MVC3项目默认在这里引用程序集。

如果你复制一个普通的ASP.NET MVC 3项目(使用默认的方法引用ASP.NET MVC3的程序集)

到一台没有安装ASP.NET MVC3的机器上,

当你运行应用程序时,

会看到一个类似的错误信息:

image

上述错误表示,

至少有一个运行ASP.NET MVC 3所需的程序集在GAC中找不到。

在机器上安装ASP.NET MVC 3就能解决这个问题,

让您的应用程序正常运行。

方法2:基于\ Bin目录中引用ASP.NET MVC组件
您的项目可以使用另一种方法

在您的Web应用程序的\bin目录中分发和引用的ASP.NET MVC3的程序集。

这种方法的好处是,你并不需要在一台机器上安装ASP.NET MVC3,以运行基于ASP.NET MVC3 Web应用程序。

相反,你只要复制你的web应用程序(在bin目录中包含MVC3的组件)到 .NET4服务器上,它就会运行。

这种方法是“完全信任”,“中等信任”的情景 (译注:我也不知道是什么意思

这意味着它甚至可以和低成本共享主机供应商共事。

无需托管服务提供商另外注册/安装/操作需要。

使您的Web项目包含ASP.NET MVC3程序集“bin部署”是非常简单的,

只需2分钟左右。下面是需要遵循的步骤:

Steps to Deploy an ASP.NET MVC 3 Application to a Web Hosting Provider with \Bin deployment

译注:这个链接好像打不开,笔者提供一个方法:

选中ASP.NET MVC引用的程序集,然后查看属性,把“复制到本地”修改为true

image

asp.net mvc3需要的程序集有

  • System.Web.Mvc
  • Microsoft.Web.Infrastructure
  • System.Web.Razor
  • System.Web.WebPages
  • System.Web.WebPages.Razor

一旦配置\BIN部署后,

您使用ASP.NET MVC 3构建的应用程序将在任何安装.NET4的Web服务器上工作。

只需复制到Web服务器,它就会运行。

即使是低成本共享托管账户,你也无需托管服务供应商做任何事。

找一个ASP.NET MVC 3网站托管服务提供商

您可以浏览Windows Web Hosting Gallery(Windows网站托管库)找到所有支持托管服务提供商:
image

Windows网站托管库允许您通过不同国家和服务水平来筛选/浏览托管服务。

它还能让您轻松过滤“共享主机”,“虚拟主机”和“专用主机”供应商。

“共享主机”是指在你没有管理员权限的远程服务器上,提供单一的Web服务器。
“虚拟主机”供应商在一个远程服务器上提供给你虚拟机 – 通常通过操作系统管理权限和管理的远程终端服务器来访问。

“专用主机”供应商提供您一个完整的物理服务器,通常也提供操作系统的管理员权限和远程终端支持。

基于Windows的网络托管的价格现在是非常符合成本效益的,

共享主机低至$2.75/月,虚拟主机提供的报价$23/月。

上述主机都能通过使用\ bin部署方法来运行ASP.NET MVC 3。

摘要
ASP.NET MVC 3的应用程序可以部署到任何拥有.NET4的Web服务器,

而不必等待托管服务提供商来安装ASP.NET MVC 3组件。

通过\ bin部署ASP.NET MVC3程序集,

只需使用上面的步骤就可转换您的项目,

那么你就可以复制你的应用程序到任何ASP.NET4服务器上。

[原创]EasyUI的numberbox取值计算问题

mikel阅读(2210)

今天遇到个比较郁闷的问题,
EasyUI的numberbox计算值总也设置不上
代码如下:

$('#number,#price').keyup(function(){
$('#total').numberbox('setValue',$('#number').numberbox('getValue')*1*$('#price').numberbox('getValue')*1);
});

只是一个简单的总金额=数量*单价的问题,居然计算不出正确的值,开始以为是keyup事件的写法问题,结果发现原来是numberbox的取值问题,代码修改如下:

$('#number,#price').keyup(function(){
$('#total').numberbox('setValue',$('#number').val()*1*$('#price').val()*1);
});

问题解决!

[转载]Delphi之使用资源文件(Using Resource Files)

mikel阅读(1103)

[转载]Delphi之使用资源文件(Using Resource Files) – 瓢虫Monster – 博客园.

New Term

每个Windows应用程序都使用资源。资源(Resources)不是可执行代码,但它属于程序的一部分元素。

典型的Windows程序的资源有:

  • 加速器(Accelerators)
  • 位图(Bitmaps)
  • 光标(Cursors)
  • 对话框(Dialog boxes)
  • 图标(Icons)
  • 菜单(Menus)
  • 数据表(Data tables)
  • 字串表(String tables)
  • 版本信息(Version information)
  • 用户定义的专用资源(User-defined specialty resources)如声音和视频文件

Note

用Project Options对话框的Version Info页面可轻松地将版本信息加到Delphi工程中。如下图:

0246

资源一般包括在扩展名为.rc的资源脚本文件中(resource script file),资源文件就是文本文件。资源文件用资源编译器编译,并在链接时加到应用程序的.exe文件中。

通常大家认为资源要加到可执行文件中,但是有些资源,如位图、字符串表、波形文件,既可以放到外部文件中(.bmp、.txt、.wav),也可加到.exe文件并包含到应用程序文件中。

把资源放到.exe文件中有两条主要优点:

  • 存取资源的速度更快。因为在一个可执行文件中查找资源花的事件比从磁盘文件中装入资源花的时间要少。
  • 程序和资源可一起包含到单个单元(即.exe文件)中,而不需要一大堆的支持文件。

它的不足之处是:会使.exe文件稍稍增大。其大小不会比外部资源文件加可执行文件大。但是增加大小会使加载该程序的时间加长。

是把资源存为外部资源文件,还是把资源放到.exe文件中,这得由编程人员自己定。但要记住的是:这两种方式用哪一种都行(甚至可以在同一个程序中使用两种方式)。

Delphi中的资源(Resources in Delphi)

传统的Windows程序几乎都至少包含一个对话框和一个图标。但是,Delphi应用程序有所不同。首先,Delphi应用程序中没有真正意义上的对话框,实质上也就是没有对话框资源(Delphi中存储的窗体是资源,但它们是RCDATA资源,而不是对话框资源)。

Delphi 应用程序有传统意义的图标资源。创建应用程序时,Delphi负责创建图标资源文件。类似地,在为Speedbutton、Image组件或BitBtn 组件选择位图时,Delphi将所选位图文件包含到窗体资源中(作为窗体资源的一部分)。在建立应用程序时,窗体和它的全部资源一起包括到程序文件中。这 些都是自动处理的。

有时需要在通常的Delphi处理中以外使用资源。例如,要制作动画,必须有一系列的位图,将它们装载进来作为可以最快速度执行的资源。在这种情况下,就需要知道如何把资源捆绑到Delphi应用程序中。

把 资源文件捆绑到可执行文件中是件非常容易的事,实际创建资源却要困难的多。如果有一个好的资源编辑器,创建诸如位图、图标和光标之类的基本资源并不困难, 但创建具有专业化品质的3D位图和图标却是一项艺术性的工作。我们肯定遇到过很多不错的程序,但它们的位图按钮实在难看。我们可以利用Delphi自带的 Image Editor创建位图、图标和光标。

如果要创建字符串资源、用户数据资源、波形文件资源或其他专用资源,则可能需要第三方资源编辑器。

Note

如 果手头有老版本的Borland Pascal,可使用其中的Resource Workshop编辑器编辑专用资源。创建好资源后,会形成一个.rc文件,Delphi中带有Borland Resource Compiler,用Borland Resource Compiler(BRCC32.EXE)将它编译成.res文件。从技术上讲,可以用任何一种文本编辑器创建.rc文件并用资源编译器编译它,但使用资 源编辑器创建资源要容易的多。

现在在推荐一个款比较不错的第三方资源编辑器Resource Builder,该软件界面简洁,使用简单,大家可以百度一下。

编译资源文件(Compiling Resource Files)

资源文件创建好后,要用资源编译器来编译它。编译资源文件的方法有两种:

  • 从命令行手工编译资源文件。
  • 添加一个批处理文件工程到工程组。

用其中任意一个方法,编译完后都得到一个.res文件,将它链接到应用程序中。

1、 从命令行编译(Compiling from the Command Line)

从命令行编译资源文件,只需打开Windows中的命令提示框,并输入一行与下面相似的命令:

brcc32 jjres.rc

0247

当然,必须保证当前系统目录为Delphi安装目录的Bin目录下,如果不是,则必须输入BRCC32.EXE的完整路径。这个资源编译器速度非常快,甚至不等察觉,它就把资源脚本文件编译完成了。

2、 使用批处理文件工程(Using a Batch File Project)

添加一个批处理文件到工程组,与从命令行编译一样简单,并且还有一个好处:保证资源文件总是最新的。要搞清楚批处理文件如何工作,可执行下面的步骤:

(1)创建一个新的应用程序;

(2)选择【View | Project Manager】打开“Project Manager”工程管理器,如下图:

0248

(3)点击“Project Manager”工具栏上的“Add New Project”按钮,显示Object Repository对象库,如下:

0249

(4)双击Batch File图标来创建文件工程。将该批处理文件工程以Project2的名称添加到“Project Manager”中,如下:

0250

(5)用鼠标右键点击批处理文件节点并选择Save,将文件保存为test.bat

0251

(6)用鼠标右键再次点击批处理文件节点并选择【Edit/Options】,会弹出“Batch File Options”对话框;

0252

(7)在Command文本框内输入下列正文:

del myfile.res

brcc32 myfile.rc

(8)点击OK关闭“Batch File Options”对话框。

这 个练习锁做的就是创建一个批处理文件,当编译工程组时,它就会执行。第(7)步输入的批处理文件命令删除一个名为myfile.res文件,并调用 Delphi资源编译器编译myfile.rc文件。用资源编译器编译myfile.rc文件会生成一个名为myfile.res的文件。

工 程组中的下一个工程可能要使用myfile.res。呵呵,那为什么要先删除myfile.res文件呢?这是因为,删除该文件后,就能知道资源编译器是 重新建立了这个文件。如果资源编译器创建资源失败,则任何要使用这个资源文件的工程都将编译失败,并报告编译错误,提示编程人员,建立资源文件出错。

把资源文件链接到你的可执行文件中(Linking Resource Files to Your Executable)

编译好资源文件后,要把编译后的资源文件链接到程序的可执行文件中,可使用$R编译器指令。例如,要链接包含在myfile.res文件中的二进制资源,可在主窗体单元的开头处插入下面一行:

1
{$R myfile.res}

就这么简单!只要指定的文件存在,Delphi就会在链接时把这个编译过的资源添加到可执行文件中。

使用资源的样本程序(A Sample Program Using Resources)

下面的清单中,列出了Jumping Jack的程序的主窗体单元。这个程序显示一个带声音效果的简单动画。主窗体上有两个按钮:一个Image组件和一个Label组件。Jumping Jack程序说说明了资源在Delphi应用程序中的使用。它特别说明了如何加载以资源文件形式存储的位图,如何加载并显示字符串资源,以及如何播放资源 文件中的波形音频。清单后面还列出了部分资源文件。先看看清单,然后再分析程序。

JJMain.pas清单

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
unit JmpJackU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, MMSystem;
{$R JJRES.RES}
const
IDS_UP = 101;
IDS_DOWN = 102;
type
TMainForm = class(TForm)
Image: TImage;
Label1: TLabel;
Start: TButton;
Stop: TButton;
procedure FormCreate(Sender: TObject);
procedure StartClick(Sender: TObject);
procedure StopClick(Sender: TObject);
private
{ Private declarations }
Done: Boolean;
procedure DrawImage(var Name: string);
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.DrawImage(var Name: string);
begin
{ 从资源文件中读取位图,通过资源名称}
Image.Picture.Bitmap.LoadFromResourceName(HInstance, Name);
{ 让Image有机会显示位图}
Application.ProcessMessages;
{ 延缓,让动画变慢}
Sleep(20);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Image.Picture.Bitmap.LoadFromResourceName(HInstance, 'ID_BITMAP1');
end;
procedure TMainForm.StartClick(Sender: TObject);
var
s: string;
ResName: string;
i: Integer;
Buff: array[0..9] of Char;
begin
s := 'ID_BITMAP';
Done := False;
while not Done do
begin
for i := 1 to 5 do
begin
ResName := s + IntToStr(i);
DrawImage(ResName);
end;
LoadString(HInstance, IDS_UP, Buff, SizeOf(Buff));
Label1.Caption := Buff;
Label1.Refresh;
PlaySound('ID_WAVEUP', HInstance, SND_ASYNC or SND_RESOURCE);
Sleep(200);
for i := 5 downto 1 do
begin
ResName := s + IntToStr(i);
DrawImage(ResName);
end;
PlaySound('ID_WAVEDOWN', HInstance, SND_ASYNC or SND_RESOURCE);
LoadString(HInstance, IDS_DOWN, Buff, SizeOf(Buff));
label1.Caption := Buff;
Label1.Refresh;
Sleep(200);
end;
end;
procedure TMainForm.StopClick(Sender: TObject);
begin
{ 当“Stop”按钮按下时,告诉循环停止}
Done := True;
end;
end.

JJRec.rc清单

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
STRINGTABLE
BEGIN
101, "Up"
102, "Down"
END
ID_WAVEUP WAVE "up.wav"
ID_WAVEDOWN WAVE "down.wav"
ID_BITMAP1 BITMAP
MOVEABLE PURE LOADONCALL DISCARDABLE
LANGUAGE LANG_NEUTRAL, 0
BEGIN
'42 4D 76 02 00 00 00 00 00 00 76 00 00 00 28 00 '
'00 00 20 00 00 00 20 00 00 00 01 00 04 00 00 00 '
'00 00 00 02 00 00 00 00 00 00 00 00 00 00 10 00 '
'00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80 '
'00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80 '
'00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF '
'00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF '
'00 00 FF FF FF 00 BB BB BB BB BB BB BB BB BB BB '
'BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB BB '
'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 B0 BB '
'BB BB BB BB BB BB BB BB BB BB BB BB BB B0 B0 BB '
此处省略了部分内容,详细内容请查看示例代码

分析:

主窗体类声明中声明了一个Done的布尔型字段,Done用于确定何时终止动画。DrawImage方法用于在Image组件中显示位图。

注意:上列代码中,使用了两个Windows API函数来加载字符串和波形文件资源。在StartClick方法中,LoadString函数加载一个字符串到到一个字符数组缓冲区内。然后将该字符数组分配给窗体上的Label组件的Caption属性。

PlaySound函数用于播放波形文件资源。PlaySound函数用SND_ASYNC标志通知Windows开始播放音频并立即将控制返回给 程序,这使得在播放音频的同时,动画能继续下去。SND_RESOURCE标志通知Windows,声音是一个资源,而不是磁盘上的一个文件。 LoadString和PlaySound函数都使用HInstance全局变量通知Windows到可执行文件中去查找资源。装入位图资源,使用VCL 方法LoadFromResourceName。

而资源文件JJRec.rc中的前5行说明字符串在资源脚本文件中的格式;使用文本编辑器创建字符串表非常容易。接下去是为两个波形文件创建各自的 WAVE资源,这两个波形文件已存在该工程目录中。资源编译器一看到WAVE声明,它就会读声音文件并将它们编译进二进制资源文件。

Note

从上面的清单中看出,使用文本编辑器来创建某些类型的资源是比较容易的事。如果位图和波形音频文件存为了外部文件,可像上面的清单那样将它们包含到.RC文件中,并用资源编译器将它们编译为二进制资源文件。其中二进制资源文件可链接到应用程序的可执行文件中。

上面的资源清单只是部分代码,用传统的资源编辑器创建的位图常常以数字数据的形式包含到资源文件中,位图的资源描述可以很长。Jumping Jack位图资源描述大约有200行,因此未在清单中全部列出。下图给出了Jumping Jack启动后的界面。

0253

为应用程序创建附加资源不是什么高深的学问,但也不是很简单的事情。要搞清楚它们如何协调配合要花一定的事件。

以上代码均在Delphi7中测试通过,示例代码下载:JumpingJack.rar

[转载]android ORM框架的性能简单测试(androrm vs ormlite)

mikel阅读(855)

[转载]android ORM框架的性能简单测试(androrm vs ormlite) – youxiachai – 博客园.

前言

看了一下现在的 Android设备,性能都不差,就懒得直接用SQLite,直接上ORM框架把,上网搜了一圈,觉得androrm, ormlite 这两个不错,当然,还有点别的,这里就不多做介绍,竟然说明了是简单测试,而本人,也不算是专业的测试人员,就测试一下这两个框架在同一设备下,插入 1w(本来是想插100w,后来插入10w,接着就只能插1w,呵呵有兴趣的可以去测试一下…)行数据的时间吧,给大家做一个简单参考,真正要做比较的 话,其实,测试,表查询才是最重要的,但是,关键我没有这样的数据源,要构建一个挺耗时间的.

测试用设备

设备名 原道N10
主控方案 RK2918
CPU 1 ghz
RAM 512 MB
系统版本 2.3.1
象限(quadrant stand) 2000分左右

影响整个测试的硬件指标估计就这几个了,测试的环境就是上表的数据了

图表

R语言生成的:

Rplot

最 快当然是直接用SQLite…(废话),从表中我们可以比较出,就ORM框架而言androrm有一丁点的速度优势,可能由于ormlite用注解字段的 方式,导致ormlite性能有着一定的损失(注解其实也是利用了反射的原理),不过,对于熟悉j2ee的朋友来讲ormlite更容易上手,而对于 python程序员学习过django这个框架的朋友更容易上手androrm.从这个简单的实验来看,官方推荐我们少用get/set方法也不是毫无道 理的,对于一个类的反射的耗时,以我的那台设备而言开销可能大约在2毫秒左右(这个以第三次androrm 与sqlite的相减再除与10000得出..),注意…这只是简单的测试而已!!!真正要比较性能还要考虑到GC的问题,所以这里这是随便说说而已!

文档活跃度

androrm ormlite
文档 不完善 超级齐全
社区 不活跃,我提交到一个bug,到现在都还没有修复的消息 活跃
更新频率 很快!

个人建议,想研究怎么写orm框架的可以用androrm,想速度的开发产品,用ormlite,其实,啥都不用最好,呵呵~

有兴趣的朋友可以下载我用来测试的源代码试一下

http://www.kuaipan.cn/file/id_2622545685705265.html