一個小項目的筆記

WeekPlan技術文檔    2006-9-19    

1.         碼錶維護:

經常要用到StringCollection,      範型list<T>,        DBExcute,

(1)StringCollection 屬於system.Collections.Specialized命名空間,感覺上類似於StringBuilder,都有Add()方法;區別:StringCollection是個數組,使用它跟使用數組一樣方便;StringBuilder功能更強,方法更多,畢竟它是能夠動態創建的。

(2)範型 屬於 System.Collections.Generic命名空間。

(3)  DBExcute是個DLL,有很多的方法,例如DataAccess.ExceSP(),DataAccess.ExceSql(),各自都有各種重載,而且重載的參數都基本一致,區別就是一個是使用存儲過程,一個是使用SQL語句。重載的參數有4種類型:

(string str_sql);    (無參)

(string sql,  List<DBParameter> dbParameter) ; (有參)

(DataTable dtTable,  string sql) (無參)

(DataTable dtTable,  string sql,  List<DBParameter> dbParameter)(有參)

 4一個處理時間的System.Globalization.Calendar將時間分成段來表示,如分成星期、月和年

                   NameValueCollection表示可通過鍵或索引訪問的關聯 String 鍵和 String 值的集合。 命名空間:System.Collections.Specialized

 

注意:DataAccess傳遞的都是DBParameter類型的參數

2#region 獲取物理表裏的字段

    private StringCollection GetFieldList()

    {

        string tableName = dplTable.SelectedValue;

 

        String SqlText = "Select * From " + tableName + " Where '1' <> '1'";

        DataTable tbFieldName = new DataTable();

        DataAccesser.ExecSql(tbFieldName, SqlText);

 

        StringCollection FieldNames = new StringCollection();

        for (int i = 0; i < tbFieldName.Columns.Count; i++)

        {

            FieldNames.Add(tbFieldName.Columns[i].Caption);

        }

        return FieldNames;

    }

#endregion

 

3.使物理表第一行值等於列名的SQL語句

String Sql = SELECT FactoryName = 'FactoryName',FactoryAlias = 'FactoryAlias',nationalName = 'nationalName'

            String  sql_Text = " SELECT ";

            for (int i = 0; i < GvAddFieldNames.Count; i++)

            {

                string CommiaFlag = (i == GvAddFieldNames.Count - 1) ? "" : ",";

                sql_Text += GvAddFieldNames[i] + " = " + "'" + GvAddFieldNames[i] + "'" + CommiaFlag;

            }

 

4.GridView的操作

(1)定義GridView中某單元格類型

TextBox tb = gvAdd.Rows[0].Cells[i].FindControl(cb) as TextBox;

            tb.Text = "";

     CheckBox cb = gvAdd.Rows[i.Cells[0].Controls[0] as CheckBox

            Cb.Checked = true;(這種寫法可能會出些問題,不安全,最好是第一種)

     TextBox txtInsert = (TextBox)gvAdd.Rows[e.RowIndex].Cells[i + 1].Controls[0];

            stringList.Add(txtInsert.Text); 注意:獲取GridViewTextBox 的值(txtInsert.Text)

 即:可以把GridView的行裏的控件當成對象,控件裏所顯示的值可以通過對該單元格的類型進行轉換,來獲取其值(例如CheckBox cb = gvAdd.Rows[i.Cells[0].Controls[0] as CheckBox)

 

     (2)若要想在點擊Update,Edit,Cancel按鈕使頁面返回原來狀態,就要在該事件裏的方法裏使用

類似與GvAdd.EditIndex = -1; 或點擊Cancel時寫GvAdd.EditIndex = -1;gvAdd.Visible = false;

     (3)如何實現單選

     <asp:GridView ID="gvTableName" runat="server" DataSourceID="SqlDataSource1" Visible="False" Font-Names="Verdana" Font-Size="8pt" ForeColor="#333333" HorizontalAlign="Left" CellPadding="4" GridLines="None">

                <Columns>

                    <asp:TemplateField>

                        <ItemTemplate>

                            <%--<asp:RadioButton runat="server" Enabled="true" GroupName="TableRadio" OnCheckedChanged="GvRbtn_CheckedChanged" />--%>

                            <input name="MyRadioButton" type="radio" id="rb" value='<%#Eval("SheetTableName") %>' />

                        </ItemTemplate>

                    </asp:TemplateField>

                </Columns>

     </asp:GridView>

     (4)如果GridViewSqlDataSource綁定了,若要實現刪除或編輯功能,需要加選擇列,如果不加,雖然數據能夠刪除,但頁面數據不再綁定

 <Columns>

                                <asp:CommandField ShowSelectButton="true" SelectText="Select" />

                                <asp:CommandField ShowDeleteButton="true" DeleteText="Delete" />

         </Columns>

   (4)對一些特殊字符,要進行字符串處理

·                         如:分別用 &amp;&lt; &gt; 替換字符 &< >

·                 用數字字符實體(&#0; &#0x1F)替換範圍 0x-0x1F(不包括空白字符 0x90x10 0x13)中的字符值。

·                 如果在屬性值的上下文中調用 WriteString,則分別用 &quot; &apos; 替換雙引號和單引號。

 

5.對TreeView的操作

(1)TreeView幾個重要屬性:

MaxDataBindDepth, ShowExpandCollapse, NodeIndent, ImageSet, RootNodeStyle-ImageUrl,

OnTreeNodePopulate, OnSelectedNodeChanged,

還可使用標籤:<NodeStyle />,<Nodes>

對於節點可以分層,:

<levelstyles>

<asp:TreeNodeStyle ImageUrl="Images/fileicon.gif" />

</levelstyles>

(2)TreeView進行操作,同樣也會對TreeNode進行操作,TreeNode裏有很多屬性,經常用的有:。。。。。。

對節點 Node的一般操作如下:

<asp:TreeView Runat="server">

  <Nodes>

    <asp:TreeNode Value="Child1" Expanded="True" Text="1">

      <asp:TreeNode Value="Grandchild1" Text="A" />

      <asp:TreeNode Value="Grandchild2" Text="B" />

    </asp:TreeNode>

    <asp:TreeNode Value="Child2" Text="2" />

    <asp:TreeNode Value="Child3" Expanded="True" Text="3">

      <asp:TreeNode Value="Grandchild1" Text="A" />

    </asp:TreeNode>

  </Nodes>

</asp:TreeView>

6.使用NExcel導入數據:

WP_DataCall.cs:

外部接口:public static void ExcelInsertDb( WP_WeekFileInfo   CurrWeekFileInfo,ref int InsertNum)

private static Boolean ExistsDataRowSplit(String FirstColStr, String DataRow   SplitNum)

private static Sheet GetCurrSheet(Workbook CurrWorkbook , WP_WeekFileInfo CurrWeekFileInfo)

    internal static String GetDataTableName(string sSheetTableName)

   private static DataTable GetDepictColInfo(string sSheetTableName)

private static DataRow GetInformationColInfo(string sSheetTableName)

      private static String DataIsExistWhere(

                WP_WeekFileInfo    CurrWeekFileInfo,           //數據文件信息

                Sheet           ExceSheet,                  //操作的Sheet 

                Int32           CurrRow)                   //當前行 

private static bool CheckRecordIsExists(String DataTableName,                                     String WhereSql)

private static StringDictionary CommonDataList( WP_WeekFileInfo CurrWeekFileInfo)

   private static Boolean IsSumSplitName(String sColSumSplitName, String CellStr)

private static StringDictionary GetFirstDataList(

                                        WP_WeekFileInfo    CurrWeekFileInfo,  //數據文件信息

                                        Sheet           ExceSheet,

                                        DataRow         InfoColDataRow,

                                        Int32           CurrRow)

     private static StringDictionary GetSecondDataList(

                                        WP_WeekFileInfo CurrWeekFileInfo,  //數據文件信息

                                        Sheet ExceSheet,

                                        DataRow InfoColDataRow,

                                        Int32 CurrRow)

private static StringDictionary GetThirdDataList(

                                        WP_WeekFileInfo CurrWeekFileInfo,    //數據文件信息

                                        Sheet ExceSheet,

                                        DataRow InfoColDataRow,

                                        Int32 CurrRow)

private static StringDictionary GetFourDataList(

                                        WP_WeekFileInfo CurrWeekFileInfo,   //數據文件信息

                                        Sheet ExceSheet,

                                        DataRow InfoColDataRow,

                                        Int32 CurrRow)

      private static Int32 GetCurrMonthTotal( WP_WeekFileInfo CurrWeekFileInfo,

                                                List<String> ColNames,

                                                List<String> ColValues)

   private static StringDictionary GetFiveDataList(

                                        WP_WeekFileInfo CurrWeekFileInfo,    //數據文件信息

                                        Sheet ExceSheet,

                                        DataRow InfoColDataRow,

                                        Int32 CurrRow)

private static SheetWorkType GetSheetWorkType(String SheetType)

  private static void CodeTableDataChange(   WP_WeekFileInfo     CurrWeekFileInfo,

                                       ref StringDictionary    DescHash)

private static String GetExcelInsertDbSqlForRow(

                WP_WeekFileInfo    CurrWeekFileInfo,           //數據文件信息

                DataRow         InfoColDataRow,

                Sheet           ExceSheet,                  //操作的Sheet 

                Int32           CurrRow,

                Int32           BeginRow,  

                ref String      StrItemCode,    

                ref String      PreFirstColStr)              //只爲折行用

private static StringDictionary GetDataList(    SheetWorkType       sheetWorkType, 

                                               WP_WeekFileInfo        CurrWeekFileInfo,

                                                  Sheet ExceSheet,    int CurrRow,

                                          DataRow             InfoColDataRow)

private static String GetExceSqlText(   WP_WeekFileInfo        CurrWeekFileInfo, 

                                                SheetWorkType       sheetWorkType,

                                                StringDictionary    CommonHash,

                                                StringDictionary    DescHash,

                                                StringDictionary    DataHash)

private static void SetInsertSqlParameter(  StringDictionary HashStr,

                                                    ref String FieldName,

                                                    ref String ValueName,

                                                    Boolean IsLast)

  private static void SetWhereSqlParmeter(    StringDictionary    HashStr,

                                                    ref String          WhereSql,

                                                    Boolean             IsLast)

private static void SetUpdateSqlParmeter(   StringDictionary HashStr,

                                                    ref String UpdateSql,

                                                    Boolean IsLast)

private static String GetFirstSql(  WP_WeekFileInfo     CurrWeekFileInfo,

                                            StringDictionary CommonHash,

                                            StringDictionary DescHash,

                                            StringDictionary DataHash)

private static String GetSecondSql( WP_WeekFileInfo     CurrWeekFileInfo,

                                            StringDictionary CommonHash,

                                            StringDictionary DescHash,

                                            StringDictionary DataHash)

private static String GetThirdSql(  WP_WeekFileInfo     CurrWeekFileInfo,

                                            StringDictionary CommonHash,

                                            StringDictionary DescHash,

                                            StringDictionary DataHash)

    private static String GetFourthSql( WP_WeekFileInfo     CurrWeekFileInfo,

                                            StringDictionary CommonHash,

                                            StringDictionary DescHash,

                                            StringDictionary DataHash)

private static String GetFifthSql(WP_WeekFileInfo CurrWeekFileInfo,

                                            StringDictionary CommonHash,

                                            StringDictionary DescHash,

                                            StringDictionary DataHash)

 

 

WP_InsertDbAndAliasUpdate.cs,

WP_Weeker.cs,

WP_WeekFileInfo.cs:

 public struct WP_WeekFileInfo (結構體):裏面包括文件名,用戶名,Sheet名,Sheet表名,當前年,當前周,Sheet類型

WP_WorkExcel.cs

關係圖:

ImportFileData.aspx.cs-- WP_InsertDbAndAliasUpdate.InserDbUpdateAlias(WeekFileInfoList, ref InsertNumList);

WP_InsertDbAndAliasUpdate.InserDbUpdateAlias--- WeekPlan_ExcelInsertDb.ExcelInsertDb(WeekFileInfoList[i], ref InsertNum);     //插入數據庫中

public static void ExcelInsertDb( WP_WeekFileInfo   CurrWeekFileInfo,ref int InsertNum)

  /*

            根據 描述 字段表:WP_ColNameRelations

            數據項字段表:WP_InformationDefine

               Sheet以及所在行確定SQL語句

            ==================================================================

            用戶接口

        */

        private static String GetExcelInsertDbSqlForRow(

                WP_WeekFileInfo    CurrWeekFileInfo,           //數據文件信息

                DataRow         InfoColDataRow,

                Sheet           ExceSheet,                  //操作的Sheet 

                Int32           CurrRow,

                Int32           BeginRow,  

                ref String      StrItemCode,    

                ref String      PreFirstColStr)              //只爲折行用 

 

{  private static void CodeTableDataChange(   WP_WeekFileInfo     CurrWeekFileInfo,

                                                        ref StringDictionary    DescHash)

 

        private static String GetExceSqlText(   WP_WeekFileInfo        CurrWeekFileInfo, 

                                                SheetWorkType       sheetWorkType,

                                                StringDictionary    CommonHash,

                                                StringDictionary    DescHash,

                                                StringDictionary    DataHash)

}

附加通過SQL語句讀寫EXCEL

SELECT *

FROM OpenDataSource

('Microsoft.Jet.OLEDB.4.0','Data Source="C:/temp/b.xls";

Extended Properties="Excel 5.0;HDR=Yes;";Persist Security Info=False')...sheet1$

 

第二個SQL語句

它通過用於 Jet OLE DB 提供程序查詢 Excel 電子表格。

SELECT * 
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
  'Data Source="c:/Finance/account.xls";User properties=Excel 5.0')...xactions$
第三個:
//創建數據連接
objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.mFilePath + ";Extended Properties=/"Excel 8.0;IMEX=1;/"");
      
                //獲取工作簿中的表
                strSql = "select * from [" + sheetName + "$]";
                //sheet填入table
                objDa = new OleDbDataAdapter(strSql, objConn);
                objDa.Fill(tTable);

 

7.使用XML導出數據

1    XmlTextWriter xm = null;

xm.WriteStartElement("Column");

            xm.WriteAttributeString("ss:Width", "158.25");

            xm.WriteEndElement();

 XmlTextWriter 中有兩個方法經常用到:WriteStartElement()寫出指定的開始標記WriteAttributeString()當在派生類中被重寫時,寫出具有指定值的屬性

WriteStartElement()

在調用此方法後,您可以書寫屬性,或使用 WriteCommentWriteString WriteStartElement 爲子元素創建內容。

可以用 WriteEndElement WriteFullEndElement 關閉元素。

 

WriteAttributeString 執行以下操作:

如果屬性值包含雙引號或單引號,則分別用 &quot; &apos; 替換它們。

如果編寫 xml:space 屬性,則編寫器驗證該屬性值是否有效。(有效值爲 preserve default。)

如果編寫 xml:lang 屬性,則編寫器不根據 W3C XML 1.0 建議驗證該屬性值是否有效。

 

注意:StreamWriterXmlTextWriter的關係與區別

(2) weekplan.Report裏的類:

8.如何配置Web.config裏的節點

(1) <appSettings>

<addkey="UploadDirectoryName" 這句指定上傳文件的名字

value="E:/WeekPlan/WeekPlanProject/WeekPlan.Web/WeekPlanUpload/" />

這句是設置該名字下上傳文件的路徑.這些都寫在<appSettings>節中

(2) <connectionStrings>

此節是設置連接字符串,: <add name="DBCon" connectionString="Data Source=192.168.0.248;Initial Catalog=WeekPlan;User providerName="System.Data.SqlClient"/>

可以設多個,只要< add name="名字 不同就行.

(3) <system.web>

(4)以上三個都配置在

<configuration> <!-- xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0" --> </configuration>這個裏面。

(5)對於UploadFile控件,需要在Web.Config裏設置它上傳文件的最大範圍,語句要寫在<system.web>這個裏,<httpRuntime useFullyQualifiedRedirectUrl="true" maxRequestLength="1024000" executionTimeout="900" />

如果沒有設置的話,系統會默認上傳文件的最大範圍爲4M,一旦上傳大於4M,頁面就不執行任何操作,變成無法刷新頁!

9.頁面設計(XHTML,CSS,JAVASCRIPT)

1)<%# 所有數據綁定表達式都必須包含在 <%# %> 字符之間。例如:<input name="MyRadioButton" type="radio" id="rb" value='<%#Eval("SheetType") %>' />

2)<%$   美元符號 ($) 通知 ASP.NET 它的後面是一個表達式。表達式前綴定義了表達式的類型,如 AppSettingsConnectionStrings Resources。冒號 (:) 後面的部分是 ASP.NET 將解析的實際表達式值。例如:<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DBCon %>"。參見ASP.NET 表達式概述

3<%@指令 指定當頁和用戶控件編譯器處理 ASP.NET Web 窗體頁 (.aspx) 和用戶控件 (.ascx) 文件時所使用的設置。

 

4)<%= %> 可以使用多種方法從 ASP.NET 程序顯示信息。一種方法是使用 <%= %> 結構。另一種方法是使用 Response.Write 語句。

<%= %> 結構在顯示單條信息時最爲有用。

顯示文本的另一種方法是使用 Response.Write 語句。可以將它放在 <% %> 塊內。

<% Response.Write("Hello, World!") %>

Response.Write 語句還可以在腳本塊內的函數或方法中使用。

5)<% %>  代碼呈現塊定義當呈現頁時執行的內聯代碼或內聯表達式。存在兩種樣式的代碼呈現塊:內聯代碼和內聯表達式。使用內聯代碼可以定義獨立的行或代碼塊。將內聯表達式用作調用 Write 方法的快捷方式。

 

ASP.NET 頁中,函數和變量應當在 <script> 塊內定義,而可執行代碼必須括在 <% %> 塊內。   

10.WeekPlan編程體會:

1.編程前思路要清晰,不要着急寫代碼,要多想程序實現中會遇到哪些問題,技術難點,要有全局觀,遇到實在解決不了的就要及時問別人,聽聽別的思路,一句話:“思路很重要!”。最後加一句,考慮問題要從根上思考,思考問題的本質。這樣寫出來的代碼能夠達到重用的效果,實現重構。

2.寫程序儘量把程序寫的能夠抽象化,能夠達到共通的效果,這樣無論以後怎麼改,怎麼維護,都很方便.相反,如果寫死,事倍功半.寫的活,而且以後還能用的上.

(3).編程中,發現任何Bug,都要用N次貼把Bug記下,都貼到記事本里,這樣在整理程序時對Bug一目瞭然,積累的多了還方便以後寫程序避免這些Bug.

補充:這個項目中會用到VS2005裏新的控件,比如:GridView,TreeView,SqlDataSource,以後還應該用到DetailsView這個控件。

4發現問題時,要想辦法做測試,鍛煉出一種能夠模擬環境的精神。這點非常重要。

5)敢於否定自己,不要怕麻煩,有想法趕快寫出來,然後去實踐,再否定,再實踐去驗證。在這過程中不要忘記多思考。

6)遇到問題要把解決問題的思路在腦子裏反覆的思考幾遍,而且有必要把這些都記在紙上。

7)解決一個問題的過程就等於把一個大問題劃分成幾個小部分。

8)分析一個問題時會遇到很多難點,注意有的難點是能夠通過算法來解決的,如果不能夠通過算法解決,就要思考用程序結構或框架解決,比如用Switch語句,接口,繼承,多態。而且在把問題分析成各個部分時,要考慮到各個部分連接的接口(接口裏的參數);還要分清哪些是可以寫在外部的,哪些是需要內部來完成的。

(9)代碼完成後要有的心態,要多測試,學學測試。

附:

每天遇到的問題:

1:如何把本機的數據庫導入到服務器

2Wrap屬性

3:值類型,引用類型。

靜態變量,靜態類

4:強類型

5:反射。

6:如何調用控件本身的事件。

7:客戶端事件OnClientClick

<asp:TemplateField ShowHeader="False">

                        <ItemTemplate>

                            <asp:LinkButton ID="BtnDelete" runat="server" CommandName="Delete" Text="Delete"

                              OnClientClick="return confirm('Are you sure to Delete the row ?');" ></asp:LinkButton>

                        </ItemTemplate>

                    </asp:TemplateField>

8. UnicodeANSI編碼

9.如何發佈程序。建好發佈好的文件,和數據庫文件,拷貝到服務器路徑下,然後建立虛擬路徑,再建立數據庫。

   需要注意 Framework版本,安裝的是否正確。

10DllImport屬性,可以調用非託管代碼寫的類庫,可以調用外部的類庫。具體做法參見MSDN DllImport屬性。

11Asp.net指令語法,頁語法,數據綁定表達式語法,ASP.NET表達式概述,從ASP.NET顯示方法。這些方法參見MSDN

12.測試Sql 語句,發現有錯誤的地方,它就把那段出錯誤的SQL文 寫到LOG日誌裏。

   public static void WriteLog(String FileFullName,String StrLog)

        {

            FileStream FStream = new FileStream(FileFullName, FileMode.OpenOrCreate, FileAccess.Write);

            StreamWriter SWriter = new StreamWriter(FStream);

            try

            {

                SWriter.BaseStream.Seek(0, SeekOrigin.End);

                SWriter.WriteLine(StrLog);

                SWriter.Flush();

            }

            finally

            {

                SWriter.Close();

                FStream.Close();

            }

        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章