学习MVC中,先在windows azure上做个网站自己测试用,先放第一个简单的物性计算功能,其他的以后再说:
1. 在64位机上用VS2010开发,在这里下载SQLite安装包
2. 下载的安装包里,有一个最重要的system.data.sqlite.dll文件,必须要选择复制到本地,也就是与所完成的EXE文件在同一目录下,或者在VS中选择Copy Local为True: 
3. 目标机必须安装MS VC++ 2010 redistributable package。在此下载
4. 如果工作机和目标机的平台不一样(一个是64位,一个是32位),则把2中的Copy Local回到False,按照以下结构布置文件:
<bin\>YourProgram.EXE
<bin\>System.Data.SQLite.DLL
<bin\x64\>SQLite.Interop.dll
<bin\x86\>SQLite.Interop.dll
其中<bin\>是工作目录,YourProgram.EXE是你自己的EXE程序,那2个SQLite.Interop.dll分别是对应64位与32位的执行DLL文件,而那个System.Data.SQLite.DLL则是一个小型DLL,与第2点中的DLL是不同的文件,这个才200多K,而那个有1M多。
这3个文件可以在这里下载:SQLiteBinaryforx86Andx64.zip
C#中用如下代码输出Grid到Excel,
- public static Microsoft.Office.Interop.Excel.Application _excelobj = new Microsoft.Office.Interop.Excel.Application();
- public static Workbook _newbook = _excelobj.Workbooks.Add();
- ////...
- Microsoft.Office.Interop.Excel.Worksheet _newsheet = _newbook.ActiveSheet;
在输出后如果关闭了Excel再调用输出,会在上面第7行出现错误 :
The object invoked has disconnected from its clients. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED))
究其原因,就是因为excel关闭以后,_newbook这个object不存在了。所以,在第7句前加一个判断即可解决:
- if (_excelobj.ActiveWorkbook == null)
- {
- _newbook = _excelobj.Workbooks.Add();
- }
- Microsoft.Office.Interop.Excel.Worksheet _newsheet = _newbook.ActiveSheet;
类成员要复制,用“=”只是添加一个reference,要真正的复制成员,正好能用上序列化。
先把类成员都标记序列化,然后使用如下代码即可。
- public MyClass Clone()
- {
- MemoryStream stream = new MemoryStream();
- BinaryFormatter formatter = new BinaryFormatter();
- formatter.Serialize(stream, this);
- stream.Position = 0;
- return formatter.Deserialize(stream) as MyClass;
- }
调用时如下:
- MyClass newClass = new MyClass();
- newClass = oldClass.Clone();
即可生成一个与oldClass完全相同的newClass.
C#中的默认Directory<>不支持序列化,也就是说无法用序列化方式把数据进行XML文件操作,要序列化,须对其进行改造如下:
- /// <summary>
- /// 支持XML序列化的泛型 Dictionary
- /// </summary>
- /// <typeparam name="TKey"></typeparam>
- /// <typeparam name="TValue"></typeparam>
- [XmlRoot("SerializableDictionary")]
- public class SerializableDictionary<TKey, TValue>
- : Dictionary<TKey, TValue>, IXmlSerializable
- {
- #region 构造函数
- public SerializableDictionary()
- : base()
- {
- }
- public SerializableDictionary(IDictionary<TKey, TValue> dictionary)
- : base(dictionary)
- {
- }
- public SerializableDictionary(IEqualityComparer<TKey> comparer)
- : base(comparer)
- {
- }
- public SerializableDictionary(int capacity)
- : base(capacity)
- {
- }
- public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
- : base(capacity, comparer)
- {
- }
- protected SerializableDictionary(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
- #endregion
- #region IXmlSerializable Members
- public System.Xml.Schema.XmlSchema GetSchema()
- {
- return null;
- }
- /// <summary>
- /// 从对象的 XML 表示形式生成该对象
- /// </summary>
- /// <param name="reader"></param>
- public void ReadXml(System.Xml.XmlReader reader)
- {
- XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
- XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
- bool wasEmpty = reader.IsEmptyElement;
- reader.Read();
- if (wasEmpty)
- return;
- while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
- {
- reader.ReadStartElement("item");
- reader.ReadStartElement("key");
- TKey key = (TKey)keySerializer.Deserialize(reader);
- reader.ReadEndElement();
- reader.ReadStartElement("value");
- TValue value = (TValue)valueSerializer.Deserialize(reader);
- reader.ReadEndElement();
- this.Add(key, value);
- reader.ReadEndElement();
- reader.MoveToContent();
- }
- reader.ReadEndElement();
- }
- /**/
- /// <summary>
- /// 将对象转换为其 XML 表示形式
- /// </summary>
- /// <param name="writer"></param>
- public void WriteXml(System.Xml.XmlWriter writer)
- {
- XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
- XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
- foreach (TKey key in this.Keys)
- {
- writer.WriteStartElement("item");
- writer.WriteStartElement("key");
- keySerializer.Serialize(writer, key);
- writer.WriteEndElement();
- writer.WriteStartElement("value");
- TValue value = this[key];
- valueSerializer.Serialize(writer, value);
- writer.WriteEndElement();
- writer.WriteEndElement();
- }
- }
- #endregion
- }
用此类型定义的Directory<>变量,可以如下进行存取:
- public void Save(string filename)
- {
- System.IO.StreamWriter writer = new System.IO.StreamWriter(filename, false, System.Text.Encoding.UTF8);
- XmlSerializer ser = new XmlSerializer(MyClassInstanceName.GetType());
- ser.Serialize(writer, MyClassInstanceName);
- writer.Close();
- }
- public MyClassName Load(string filename)
- {
- System.IO.StreamReader reader = new System.IO.StreamReader(filename);
- XmlSerializer ser = new XmlSerializer(MyClassInstanceName.GetType());
- MyClassName result = new MyClassName ();
- result.MyClassInstanceName = (SerializableDictionary<string,int>)ser.Deserialize(reader);
- reader.Close();
- return result;
- }




