2010年12月19日 星期日

ObjectDumper

//Copyright (C) Microsoft Corporation. All rights reserved.

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;


public class ObjectDumper {

public static void Write(object element)
{
Write(element,
0);
}

public static void Write(object element, int depth)
{
Write(element, depth, Console.Out);
}

public static void Write(object element, int depth, TextWriter log)
{
ObjectDumper dumper
= new ObjectDumper(depth);
dumper.writer
= log;
dumper.WriteObject(
null, element);
}

TextWriter writer;
int pos;
int level;
int depth;

private ObjectDumper(int depth)
{
this.depth = depth;
}

private void Write(string s)
{
if (s != null) {
writer.Write(s);
pos
+= s.Length;
}
}

private void WriteIndent()
{
for (int i = 0; i < level; i++) writer.Write(" ");
}

private void WriteLine()
{
writer.WriteLine();
pos
= 0;
}

private void WriteTab()
{
Write(
" ");
while (pos % 8 != 0) Write(" ");
}

private void WriteObject(string prefix, object element)
{
if (element == null || element is ValueType || element is string) {
WriteIndent();
Write(prefix);
WriteValue(element);
WriteLine();
}
else {
IEnumerable enumerableElement
= element as IEnumerable;
if (enumerableElement != null) {
foreach (object item in enumerableElement) {
if (item is IEnumerable && !(item is string)) {
WriteIndent();
Write(prefix);
Write(
"...");
WriteLine();
if (level < depth) {
level
++;
WriteObject(prefix, item);
level
--;
}
}
else {
WriteObject(prefix, item);
}
}
}
else {
MemberInfo[] members
= element.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance);
WriteIndent();
Write(prefix);
bool propWritten = false;
foreach (MemberInfo m in members) {
FieldInfo f
= m as FieldInfo;
PropertyInfo p
= m as PropertyInfo;
if (f != null || p != null) {
if (propWritten) {
WriteTab();
}
else {
propWritten
= true;
}
Write(m.Name);
Write(
"=");
Type t
= f != null ? f.FieldType : p.PropertyType;
if (t.IsValueType || t == typeof(string)) {
WriteValue(f
!= null ? f.GetValue(element) : p.GetValue(element, null));
}
else {
if (typeof(IEnumerable).IsAssignableFrom(t)) {
Write(
"...");
}
else {
Write(
"{ }");
}
}
}
}
if (propWritten) WriteLine();
if (level < depth) {
foreach (MemberInfo m in members) {
FieldInfo f
= m as FieldInfo;
PropertyInfo p
= m as PropertyInfo;
if (f != null || p != null) {
Type t
= f != null ? f.FieldType : p.PropertyType;
if (!(t.IsValueType || t == typeof(string))) {
object value = f != null ? f.GetValue(element) : p.GetValue(element, null);
if (value != null) {
level
++;
WriteObject(m.Name
+ ": ", value);
level
--;
}
}
}
}
}
}
}
}

private void WriteValue(object o)
{
if (o == null) {
Write(
"null");
}
else if (o is DateTime) {
Write(((DateTime)o).ToShortDateString());
}
else if (o is ValueType || o is string) {
Write(o.ToString());
}
else if (o is IEnumerable) {
Write(
"...");
}
else {
Write(
"{ }");
}
}
}

2010年12月10日 星期五

2010年12月3日 星期五

安裝 SQL Server時發生 效能計數器登錄區一致性 的錯誤

我發現再重安裝SQL Server 2008 系統
或是安裝英文版的 SQL Server 2008 時
都會遇到 效能計數器登錄區一致性 的錯誤

微軟的官方解法是利用翻譯機翻的結果
不是很容易懂

http://demo.tc/Post/450
圖文併茂的說明
將 Perflib 下的 004/009 的 LastCounter, LastHelp 的最大值
更新到 Perflib 中的 LastCounter, LastHelp
就可順利解決, 推薦!

2010年12月1日 星期三

DB to XML, then XML to DB

1. 第一段 Script 的重點在於寫資料到XML 告知 .NET 需要寫入資料外也一併將 Schema 寫進到 XML 中
2. 第二段 Script 的重點在於利用 XSD 功能將對應的 INSERT 敘述產生出來
3. 第二段 Script 的另一個重點是利用 Merge 將 Memory 中的 DataSet 資料灌進到 XSD 的 DataTable
3. 第二段 Script 的最後一個重點是利用 Adapter.Update 將 XSD 的 DataTable 資料呼叫對應的 InsertCommand (利用 XSD產生)
寫入資料庫

        protected void ReadDataBaseAndWriteToXML()
        {           
            using (SqlConnection conn = form.DataBaseManager.getConnection())
            {
           
                SqlCommand command = conn.CreateCommand();
                command.CommandText = "select * from ow_param";
                SqlDataAdapter adapter = new SqlDataAdapter("select * from ow_param", conn);
                DataSet dataset = new DataSet();

                adapter.Fill(dataset);
                // dataset.WriteXml(@"c:\ow_param.xml"), only output the string format data
                dataset.WriteXml(@"c:\ow_param_w_schema.xml", XmlWriteMode.WriteSchema);
               
            }
           
           
        }

        protected void LoadXMLSchemaAndSaveToDB()
        {

            DataSet dataset = new DataSet();           
            dataset.ReadXml(@"c:\ow_param_w_schema.xml");
            string tableName = dataset.Tables[0].TableName;           

            using (basic.xsd.oym_ow_paramTableAdapters.OW_PARAMTableAdapter ow_paramAdapter = new ICE.basic.xsd.oym_ow_paramTableAdapters.OW_PARAMTableAdapter())
            {

                DataTable xmlTable = dataset.Tables[tableName];
                basic.xsd.oym_ow_param.OW_PARAMDataTable dbTable =  ow_paramAdapter.GetData();
                dbTable.Merge(xmlTable);
                if (dbTable != null)
                {
                    ow_paramAdapter.Update(dbTable);
                }
            }

        }