1 public class SinaoAuth 2 { 3 string APIHost = ""; 4 public SinaoAuth() 5 { 6 APIHost = SinaConfig.Sina_Host; 7 } 8 9 #region 绑定微博帐号 10 /// <summary> 11 /// 绑定微博帐号 12 /// </summary> 13 /// <param name="username">新浪微博的登录帐号</param> 14 /// <param name="password">新浪微博的登录密码</param> 15 /// <returns>失败返回null</returns> 16 public string Binding(String username, String password) 17 { 18 if (String.IsNullOrEmpty(username) || String.IsNullOrEmpty(password)) 19 { 20 return null; 21 } 22 string apiUrl = "https://api.weibo.com/oauth2/access_token?client_id=" + SinaConfig.Sina_AppKey + "&client_secret=" + SinaConfig.Sina_AppSecurity + "&grant_type=password&username=" + username + "&password=" + password; 23 24 try 25 { 26 HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(apiUrl); 27 webReq.Method = "POST"; 28 webReq.Timeout = 2000; 29 //webReq.Headers.Add("Authorization", header); 30 HttpWebResponse webRsp = (HttpWebResponse)webReq.GetResponse(); 31 32 using (StreamReader reader = new StreamReader(webRsp.GetResponseStream())) 33 { 34 string rsp = reader.ReadToEnd(); 35 AccessTokenResponse accessToken = new AccessTokenResponse(rsp); 36 if (accessToken != null && accessToken.IsValid) 37 { 38 return accessToken.AccessToken; 39 } 40 else 41 { 42 return null; 43 } 44 } 45 } 46 catch (WebException e) 47 { 48 return GetErrorMessage(e); 49 } 50 } 51 52 private string GetErrorMessage(WebException e) 53 { 54 try 55 { 56 HttpWebResponse webResponse = e.Response as HttpWebResponse; 57 StreamReader myread = new StreamReader(webResponse.GetResponseStream()); 58 string error = myread.ReadToEnd(); 59 ErrorMessage errorMessage = new ErrorMessage(error); 60 return errorMessage.Error_code; 61 } 62 catch (Exception ex) 63 { 64 return ex.Message; 65 throw; 66 } 67 } 68 69 /// <summary> 70 /// 用web方式登录 71 /// </summary> 72 /// <param name="code"></param> 73 /// <returns></returns> 74 public string Binding(string code) 75 { 76 string apiUrl = "https://api.weibo.com/oauth2/access_token?client_id="+SinaConfig.Sina_AppKey+"&client_secret="+ 77 SinaConfig.Sina_AppSecurity + "&grant_type=authorization_code&redirect_uri=http://sae.sina.com.cn/&code="+code; 78 try 79 { 80 HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(apiUrl); 81 webReq.Method = "POST"; 82 webReq.Timeout = 2000; 83 //webReq.Headers.Add("Authorization", header); 84 HttpWebResponse webRsp = (HttpWebResponse)webReq.GetResponse(); 85 86 using (StreamReader reader = new StreamReader(webRsp.GetResponseStream())) 87 { 88 string rsp = reader.ReadToEnd(); 89 AccessTokenResponse accessToken = new AccessTokenResponse(rsp); 90 if (accessToken != null && accessToken.IsValid) 91 { 92 return accessToken.AccessToken; 93 } 94 else 95 { 96 return null; 97 } 98 } 99 } 100 catch (WebException e) 101 { 102 return GetErrorMessage(e); 103 } 104 } 105 106 /// <summary> 107 /// 直接发送微博 108 /// </summary> 109 /// <param name="access_token"></param> 110 /// <param name="status"></param> 111 /// <returns></returns> 112 public string update(string access_token,string status) 113 { 114 string apiUrl = "https://api.weibo.com/2/statuses/update.json"; 115 try 116 { 117 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(apiUrl); 118 request.Method = "POST"; 119 request.Timeout = 2000; 120 request.ContentType = "application/x-www-form-urlencoded"; 121 System.Text.Encoding encoding = System.Text.Encoding.ASCII; 122 byte[] bytesToPost = encoding.GetBytes("access_token=" + access_token + "&status=" + UrlEncode(status)); 123 request.ContentLength = bytesToPost.Length; 124 System.IO.Stream requestStream = request.GetRequestStream(); 125 requestStream.Write(bytesToPost, 0, bytesToPost.Length); 126 requestStream.Close(); 127 128 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 129 using (StreamReader reader = new StreamReader(response.GetResponseStream())) 130 { 131 string rsp = reader.ReadToEnd(); 132 if (rsp != "") 133 { 134 return "SUCCESS"; 135 } 136 } 137 return null; 138 } 139 catch (WebException ex) 140 { 141 return GetErrorMessage(ex); 142 } 143 } 144 145 public static string UrlEncode(string str) 146 { 147 StringBuilder sb = new StringBuilder(); 148 byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str) 149 for (int i = 0; i < byStr.Length; i++) 150 { 151 sb.Append(@"%" + Convert.ToString(byStr[i], 16)); 152 } 153 154 return (sb.ToString()); 155 } 156 157 /// <summary> 158 /// 发送带图片的微博 159 /// </summary> 160 /// <param name="access_token"></param> 161 /// <param name="status">文字内容</param> 162 /// <param name="pic">图片的byte流</param> 163 /// <returns></returns> 164 public string ShareImg(string access_token,string status,byte[] pic) 165 { 166 string apiUrl = "https://api.weibo.com/2/statuses/upload.json?access_token=" + access_token + "&status=" +UrlEncode(status) + "&pic=" + @pic + ""; 167 168 try 169 { 170 HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(apiUrl); 171 webReq.Method = "POST"; 172 webReq.Timeout = 2000; 173 string boundary = Guid.NewGuid().ToString(); 174 //webReq.ContentType = string.Format("text/html; charset=GBK"); 175 webReq.ContentType=string.Format("multipart/form-data; boundary={0}", boundary); 176 byte[] contents = getMultipartContent(status, pic, boundary); 177 webReq.ContentLength = contents.Length; 178 webReq.GetRequestStream().Write(contents, 0, contents.Length); 179 180 HttpWebResponse webRsp = (HttpWebResponse)webReq.GetResponse(); 181 182 using (StreamReader reader = new StreamReader(webRsp.GetResponseStream())) 183 { 184 string rsp = reader.ReadToEnd(); 185 if (rsp != "") 186 { 187 return "SUCCESS"; 188 } 189 } 190 return null; 191 } 192 catch (WebException e) 193 { 194 return GetErrorMessage(e); 195 } 196 } 197 198 199 private byte[] getMultipartContent(string msg, byte[] pic, string boundary) 200 { 201 string contentEncoding = "iso-8859-1"; 202 string header = string.Format("--{0}", boundary); 203 string footer = string.Format("--{0}--", boundary); 204 205 StringBuilder contents = new StringBuilder(); 206 contents.AppendLine(header); 207 contents.AppendLine(String.Format("Content-Disposition: form-data; name=\"{0}\"", "status")); 208 contents.AppendLine("Content-Type: text/plain; charset=US-ASCII"); 209 contents.AppendLine("Content-Transfer-Encoding: 8bit"); 210 contents.AppendLine(); 211 contents.AppendLine(UrlEncode(msg)); 212 213 contents.AppendLine(header); 214 contents.AppendLine(string.Format("Content-Disposition: form-data; name=\"{0}\"", "source")); 215 contents.AppendLine("Content-Type: text/plain; charset=US-ASCII"); 216 contents.AppendLine("Content-Transfer-Encoding: 8bit"); 217 contents.AppendLine(); 218 contents.AppendLine(SinaConfig.Sina_AppKey); 219 220 contents.AppendLine(header); 221 string fileHeader = string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"", "pic", ""); 222 string fileData = System.Text.Encoding.GetEncoding(contentEncoding).GetString(pic); 223 224 contents.AppendLine(fileHeader); 225 contents.AppendLine("Content-Type: application/octet-stream; charset=UTF-8"); 226 contents.AppendLine("Content-Transfer-Encoding: binary"); 227 contents.AppendLine(); 228 contents.AppendLine(fileData); 229 contents.AppendLine(footer); 230 231 return Encoding.GetEncoding(contentEncoding).GetBytes(contents.ToString()); 232 } 233 234 #endregion 235 }
提供学习交流,不正确的希望园子们指出来 谢谢 哈。
Excle环境配置:
对 Excel进行编程,实际上就是通过 .Net Framework去调用 Excel的 COM组件,所有要在 Web环境下调用 COM组件的时候,都需要对其进行相应的配置。
很多朋友都反映在 Windows环境下调试正常的程序,一拿到 Web环境中就出错,实际上就是因为缺少了这一步。
下面就详细介绍 DCOM的配置过程。
1、运行“dcomcnfg”,打开 DCOM配置程序。(或者 开始→设置→控制面版→管理工具→组件服务→计算机→我的电脑→DCOM配置)

2、在应用程序列表中找到“Microsoft Excel应用程序”,点击“属性”,在2003下面如果没找不到属性,请打SP2补丁。

3、将 “常规”选项卡中的 “身份验证级别”设为 “无”。

4、选中 “安全性”选项卡中的 “使用自定义配置权限”,点击 “编辑”。

5、在打开的对话框中添加 “Internet来宾用户”(通常是IUSR_机器名) ,访问类型设为“完全控制”。

6、将 “身份标识”选项卡中的用户设为 “交互式用户”。

7、点击“应用”之后,关闭属性页和 DCOM配置程序。配置完成
Excle设置参考
http://www.cnblogs.com/sjjsky/archive/2008/03/26/1123002.html
自定义COM+组件,在启动时报错“错误代码 8000401A - 因为配置类型不正确,系统无法开始服务器进程。请检查用户名和密码。”
解决办法:
运行dcomcnfg打开组件服务,
依次展开"组件服务"->"计算机"->"我的电脑"->"COM+应用程序"
找到对应的应用程序
右键打开属性对话框,点击"标识"选项卡,
点"下列用户",把管理员(Administrator)的用户和密码(登陆服务器的密码)正确填写进去。但一旦重新装系统或者密码变化后需要重新在此处设置密码。
Activity :
activity是Android提供的界面,所有和用户交互的事情都发生在这个类。
Activity的生命周期:
OnCreate() 创建的时候会调用这个方法 设置这个Activity设置布局控件,初始化数据等。
OnStart() 当控件被我们看到的时候,就调用OnStart()方法 在OnCreate()之后 或者OnStop()后调用。
OnResume() 当重新获得用户焦点的时候就调用这个方法。
onPause() 保护现场用的 可能被另外一个透明的Dialog窗口覆盖,失去焦点,但是他仍然和窗口管理器保持连接,系统可以继续保护Activity的内部状态。
onStop() 停止和OnStart()对应,注意OnStop()和OnPause()不一样的地方是他是完全被另外一个窗口覆灭。也就是失去焦点而且不可见。
onDestory()销毁
创建一个Activity的要点
1.一个Activity就是一个类,并且这个类要继承Activity
2.需要复写onCreate方法
3.要在Androidmanifest.xml进行配置(四大组件都要进行配置)
4.为Activity添加必要的控件
在一个Activity启动另外一个Activity
Intent intent=new Intent(CurrentActivity.this,OtherActivity.class) //OtherActivity也要在AndroidManifest.xml中注册。
startActivity(intent);
Intent还可以放入各种数据 传入下一个Activity。
可以用下面的方式接收传过来的数据:
还可以用Bundel的方法发送数据。Bundel就像一个承载数据的List<> 里面可以放各种数据。但是他的key只能是string类型的,放入Intent的方式也是intent.putExtra(bundle);
Service:
Service在什么时候会用到呢?比如说音乐程序的时候,需要后台运行,但是又看不到界面,此时就用到Service。这也是Service和Activity最大的不同。
Service 分类:
本地Service和远程Service。
本地Service是同一个进程内Service彼此之间共同的内存区域。
远程Service是同一个系统内的不同进程之间访问(注意是同一个系统内,不是不同系统)。
Service生命周期:
onCreate()->onStart()->onDestory() 三个方法 继承的时候如果要用到记得重新写下。
创建一个Service要点:
1. 创建一个类,要继承Service
2. 要在androidManifest.xml中进行配置
3. 在Activity中配置调用它
Broadcast Receiver:
在android中可以通过broadcast告诉其他程序发生了什么事情。比如电源,比如短信,比如信号。
Broadcast Receiver相比于其他组件比较特别的地方是他还提供了一种所谓的热注册,就是不用写在androidManifest.xml中,直接用
registerReceiver(Broadcastreceiver,IntentFilter)注册。然后用unregisterReceiver()消除注册。
一些常用的Action:
ACTION_CALL activity 启动一个电话.
ACTION_EDIT activity 显示用户编辑的数据.
ACTION_MAIN activity 作为Task中第一个
Activity启动
ACTION_SYNC activity 同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告.
ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告
ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告.
ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告.
Content Provider:
这个组件比较复杂
ContentProvider可以支持多个应用的数据共享。可以用来操作音频,视频,图片,私人通讯录等等。但是要记得获取适当的读取权限。当然也可以用来公开自己的数据。(难道Content Provider是全局变量?整个手机的程序都能访问得到?)
创建Content Provider 要点:
1. 创建一个Content Provider首先要继承ContentProvider类。
2. 在androidManifest中配置
3. 在Activity类中调用insert() query()可以调用
实际上所有的contentprovider用户都不能直接访问contentprovider实例,只能通过ContentResolver的中间代理。而要得到ContentResolver的实例可以用Activity的getContentResolver方法。如下
而
可以自己去调用ContentProvider相应的方法。
Uri使用方法:来自http://blog.sina.com.cn/s/blog_5688414b0100xagp.html
为系统的每一个资源给其一个名字,比方说通话记录。
1、每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。
2、Android所提供的ContentProvider都存放在android.provider包中。 将其分为A,B,C,D 4个部分:
A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://"
B:URI 的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称;"content://hx.android.text.myprovider"
C:路径,不知道是不是路径,通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就ok了
"content://hx.android.text.myprovider/tablename"
D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部;"content://hx.android.text.myprovider/tablename/#" #表示数据id
数据模型:
ContentProvider返回的数据结构是Cursor类似于DataSet,每一个contentprovider 定义一个唯一公开的URI,用于指定他的数据集。一个contentprovider可以包含多个数据集。这样就需要多个URI与之对应。URI的开头必须是 “content://”
表示这个Uri指定一个contentprovider。
增删查改:
查询
Cursor cursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,null,null);
得到查询数据:
Cursor.moveToNext()读取到下一条 类似于C#的sdr.read()
条件发在哪里?
可以放在
修改:
插入:
数据放在values内,values是键值对。如下:
ContentValues values = new ContentValues();
values.put(People.NAME, "Abraham Lincoln");
Uri uri = getContentResolver().insert(People.CONTENT_URI, values);
错误应该很多 求指点....刚刚开始的Android之旅。。。
嗯 多字段查找和删除重复数据。 in 语句在SQL Server 里面不能有多个字段的 所以用inner join 可以 0
select * from CET4Grade a inner join
(select SJXQ,XQ,StudentID from dbo.CET4Grade
group by SJXQ,XQ,StudentID having count(*)>1)
b on a.SJXQ=b.SJXQ and a.XQ=b.XQ and a.StudentID=b.StudentID
删除 嗯 用exists
Delete t from dbo.CET4Grade t where exists
(
select SJXQ,XQ,StudentID from CET4Grade
group by SJXQ,XQ,StudentID having count(*)>1 and SJXQ=t.SJXQ and XQ=t.XQ and StudentID=t.StudentID
)
来自http://blog.sina.com.cn/s/blog_4d879e610100kswa.html
这个是可以的,当你在Form1激活的时候,按下A键,系统会切换到另一个程序上。
public class Form1 : Form{
}
下面是从MSDN上摘录的关于SendKeys.Send的说明:
SendKeys.Send 方法
向活动应用程序发送击键。
命名空间:System.Windows.Forms
程序集:System.Windows.Forms(在 system.windows.forms.dll 中)
语法
Visual Basic(声明)
Public Shared Sub Send ( _
keys As String _
)
Visual Basic(用法)
Dim keys As String
SendKeys.Send(keys)
C#
public static void Send (
string keys
)
参数
keys
要发送的击键字符串。
异常
异常类型 条件
InvalidOperationExceptio
ArgumentException
备注
每个键都由一个或多个字符表示。若要指定单个键盘字符,请使用该字符本身。例如,若要表示字母 A,请将字符串“A”传递给方法。若要表示多个字符,请将各个附加字符追加到它之前的字符的后面。若要表示字母 A、B 和 C,请将参数指定为“ABC”。
加号 (+)、插入符号 (^)、百分号 (%)、波浪号 (~) 以及圆括号 ( ) 对 SendKeys 具有特殊含义。若要指定这些字符中的某个字符,请将其放在大括号 ({}) 内。例如,若要指定加号,请使用“{+}”。若要指定大括号字符,请使用“{{}”和“{}}”。中括号 ([ ]) 对 SendKeys 没有特殊含义,但必须将它们放在大括号内。在其他应用程序中,中括号具有特殊含义,此含义可能会在发生动态数据交换 (DDE) 时起重要作用。
警告
如果应用程序用于键盘各不相同的国际用途,则使用 Send 可能产生不可预知的结果,应避免使用它。
若要指定在按键(如 Enter 或 Tab)时不显示的字符,以及表示操作而不表示字符的键,请使用下表中的代码:
键
Backspace {BACKSPACE}、{BS} 或 {BKSP}
Break {BREAK}
Caps Lock
Del 或 Delete {DELETE} 或 {DEL}
向下键 {DOWN}
End {END}
Enter {ENTER} 或 ~
Esc {ESC}
Help
Home {HOME}
Ins 或 Insert {INSERT} 或 {INS}
向左键
Num Lock
Page Down
Page Up
Print Screen
向右键
Scroll Lock
Tab
向上键 {UP}
F1
数字键盘加号
数字键盘减号
数字键盘乘号
数字键盘除号
若要指定与 Shift、Ctrl 和 Alt 键的任意组合一起使用的键,请在这些键代码之前加上以下一段或多段代码。
键
Shift + Ctrl ^ Alt %
若要指定在按一些键时应同时按住 Shift、Ctrl 和 Alt 键的任意组合,请将这些键的代码放在括号内。例如,若要指定按 E 和 C 时同时按住 Shift 键,请使用“+(EC)”。若要指定按 E 时应按住 Shift,之后按 C 时不按住 Shift,请使用“+EC”。
若要指定重复键,请使用格式 {key number}。键和数字之间必须放一空格。例如,{LEFT 42} 表示按向左键 42 次;{h 10} 表示按 H 10 次。
注意
因为没有可用来激活另一个应用程序的托管方法,所以可以在当前应用程序中使用此类,或使用本机 Windows 方法(如 FindWindow 和 SetForegroundWindow)来强制聚焦到其他应用程序上。

