记录Harde学习成长生活的点点滴滴.
2011-05-18 数据库


没有评论
63 次浏览

insert into 后获得自动插入的id(select @@identity)

做软件时常常遇到这样的情况~对于有自动增长列的表,我们在insert 以后想要得到自动增长的id~

在MSSQL下做到很容易,在你的insert语句末尾加上@@identity是绝大多数学生或新手的做法~

1
;select @@identity

但事实上,并不推荐使用@@identity来获取自动增长值~
因为@@IDENTITY 返回值,是当前会话的“所有作用域”中的任何表最后生成的标识值。
有很大的不确定性

所以建议使用SCOPE_IDENTITY()与IDENT_CURRENT(‘表名’)代替
所以推荐的写法是

1
2
3
;select SCOPE_IDENTITY()
 
;select IDENT_CURRENT('table')

举例

1
insert into UserInfo values('admin');select IDENT_CURRENT('UserInfo') as id

注解:
IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

2011-05-07 DotNet


没有评论
111 次浏览

在没有安装Office的计算机上使用Excel组件

做了个小项目,需要导出Excel,问题不大~ 添加Excel引用~ 很容易就做到了~
不过有个问题,如果目标计算机没有安装Office,那么程序将抛出异常~ 虽然按理说使用这个功能就应该有Office,不过作为严谨的程序员~ 就应该考虑到这个问题~

让客户安装Office?不是吧太小题大作了….

跟我来
首先如果你是用VS2008开发请进入cmd,切换到如下目录
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin
如果是Vs2005,请进入这个
X(都懂~):\Microsoft Visual Studio 8\SDK\v2.0\Bin\

进入你Office的安装文件夹,把Excel.exe复制到上述文件夹
比如我的就是在C:\Program Files\Microsoft Office\Office14中

然后在cmd中执行TlbImp /out:Interop.Excel.dll Excel.exe
如果看到类似如下提示就说明成功了

1
2
3
4
5
6
7
8
9
Microsoft (R) .NET Framework Type Library to Assembly Converter 3.5.30729.1
Copyright (C) Microsoft Corporation.  All rights reserved.
 
TlbImp : warning TI0000 : Primary interop assembly 'Microsoft.Office.Interop.Ex
el, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C' is alre
dy registered for type library 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\B
n\Excel.exe'.
Type library imported to C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\Inte
op.Excel.dll

把生成的Interop.Excel.dll考出来,在项目中引用就OK啦~

子类、父类互相赋值的解决办法

最近写东西遇到这么个问题,A为基类,B继承A并做了扩展
数据获取时只能得到A,但是需要用B来显示数据~
现在就需要把A所有的属性赋值给B~
第一想法就是把迭代A的属性,全部赋值给B~
本着能懒就懒的原则~ Google了一下~ 真让我找到了~ 不过有些小问题~
加工了一下~
使用范例

?View Code CSHARP
1
2
3
4
A a = null;
B b = null;
a = manager.Get();//假设这里给A赋值了~
b = SetProperties<A,B>(a);
?View Code CSHARP
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
public L SetProperties<T, L>(T t) where L : new()
    {
      if (t == null)
      {
        return default(L);
      }
      System.Reflection.PropertyInfo[] propertiesT = typeof(T).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
      System.Reflection.PropertyInfo[] propertiesL = typeof(L).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
      //if (propertiesT.Length != propertiesL.Length || propertiesL.Length == 0)
      //{
      //    return default(L);
      //}
      L setT = new L();
 
      foreach (System.Reflection.PropertyInfo itemT in propertiesT)
      {
        foreach (System.Reflection.PropertyInfo itemL in propertiesL)
        {
          if (itemL.Name == itemT.Name)
          {
            object value = itemT.GetValue(t, null);
            itemL.SetValue(setT, value, null);
          }
        }
      }
 
      return setT;
    }

你可以调整下foreach的次序来控制以A或者B的属性为基准~

[ASP.NET]解决Menu在Chrome以及Safari浏览器中不显示的问题

今天第一次在项目中使用Menu~ 遇到个问题 在Chrome里“消失”了~
Google一下,原来还不是个例~有不少解决方案了~
在项目中“添加新项”->“浏览器文件”
把内容替换成如下

?View Code CSHARP
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
<!--
可在 <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers 中找到现有的浏览器定义
-->
<browsers>
  <browser id="NewBrowser" parentID="Mozilla">
    <identification>
      <userAgent match="Unique User Agent Regular Expression" />
    </identification>
    <capture>
      <userAgent match="NewBrowser (?'version'\d+\.\d+)" />
    </capture>
    <capabilities>
      <capability name="browser" value="My New Browser" />
      <capability name="version" value="${version}" />
    </capabilities>
  </browser>
  <browser refID="Mozilla">
    <capabilities>
      <capability name="xml" value="true" />
    </capabilities>
  </browser>
  <browser  id ="Safari3"  parentID ="Safari1Plus">
    <identification >
      <userAgent  match ="Safari/\d+\.\d+"/>
    </identification>
    <capture>
      <userAgent  match ="Version/(?'version'\d+\.\d+)"/>
    </capture>
    <capabilities>
      <capability  name ="browser"  value ="Safari3"/>
      <capability  name ="version"  value ="${version}"/>
    </capabilities>
    <controlAdapters>
      <adapter  controlType ="System.Web.UI.WebControls.Menu" adapterType =""/>
    </controlAdapters>
  </browser>
  <browser  id ="GoogleChrome"  parentID ="Safari3">
    <identification>
      <userAgent  match ="Chrome/(?'version'\d+\.\d+)"/>
    </identification >
    <capabilities >
      <capability  name ="browser"  value ="Googlebot"/>
    </capabilities>
  </browser>
</browsers>

ok~问题搞定~ 不过最后没用Menu……

2011-04-23 DotNet


没有评论
39 次浏览

让Winform程序单实例运行

方法其实很简单
修改程序入口处代码如下显示就可以了

?View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            bool isFirst;
            System.Threading.Mutex mtx = new System.Threading.Mutex(false, "Harde.Common", out   isFirst);
            if (isFirst)
            {
                Application.Run(new frm_Main());
            }
        }

为了更人性化一点你还可以在if的else里弹出个对话框

?View Code CSHARP
1
2
3
4
5
6
7
8
9
            if (isFirst)
            {
                Application.Run(new frm_Main());
            }
            else
            {
                MessageBox.Show("已经有一个程序在运行了。\r\n请勿重复运行。","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
        }

好啦~ 试一下吧~

返回顶部
分享按钮