一些可能有點用處的C#開發經驗

前言:程序員

下個月就要去進行Java開發了,之後C#碰的就少了(惋惜去年買了三本C#的書,幾乎仍是全新的……),平時一些經驗都記在OneNote裏面,如今收集整理出來,由於只能利用交接工做的打醬油的時間,暫時沒什麼排版,陸續更新中……sql

 

裏面的經驗基本上都是比較初級的,是在進行開發工做中極可能遇到的問題~不少都是我的總結,蒐集,確定有些不合理甚至錯誤的東西,望不吝指正。數據庫

 

2015年4月1日17:52:17服務器

基本更新完成,還有部份內容記載具體的項目經驗中,還須要篩選下……框架

 

C#篇:

一、目標平臺的選擇

64位操做系統在編譯VS裏的程序時,根據須要設置項目屬性的「目標平臺」爲x86。若是設置爲AnyCPU,則在VS 2005裏面是不能「編輯並繼續」的。ide

——在選擇x86和AnyCPU均可以在32位操做系統上使用。函數

——選擇x86在64位服務器上運行,可能會形成類庫沒法加載的問題。此問題在後文IIS經驗中解釋。性能

 

二、取DataTable或者DataGridView裏面值的兩種經常使用方法:

dt.Rows[i].Cells["ID"].Value.ToString();
dt.Rows[0]["Name"].ToString();

前者須要從Value中取值,使用起來不是太方便。後者且不能加Value測試

——全部的中括號中均可以使用序號(從0開始)或是字段名(列名、行名)ui

 

三、若是沒有使用Linq(一直都用的2.0框架……),可使用此法來寫執行SQL。如:

string strSQL = string.Format("Insert table_1 values('{0}', '{1}',{2},{3})"

若是是varchar類型,必須使用'';若是是int,目前發現既可以使用''也能夠不使用,每每寫腳本,嫌麻煩,就都帶上了'',貌似執行上不會有問題,但不知道性能會不會有所降低。若是有知道的朋友請在評論區說下咯。

——有朋友評論說這個容易被注入式攻擊。查了下避免注入式攻擊的方法:一、使用存儲過程;二、參數化SQL語句。

——如下是使用參數化SQL語句的方式:

 

SqlCommand command = new SqlCommand("select * from UserInfo where sex=@sex and age>@age", connection); 
SqlParameter parameter = new SqlParameter("@age", SqlDbType.Int);//注意UserInfo表裏age字段是int類型的 
parameter.Value = 30; 
command.Parameters.Add(parameter);//添加參數 
SqlDataAdapter adapter = new SqlDataAdapter(command); 

 

四、DLL引用了,可是在代碼裏面仍是沒法調用。

嘗試在DLL的屬性裏面設置使用特定版本爲False

 

五、類庫裏的方法在調用的時候,如何讓方法上面顯示自定義說明?

勾選一下項目:屬性——生成——XML文檔文件

——使用類庫的時候,把對應的XML也拷貝的相同目錄,這樣會在VS中看到類庫函數的自定義說明。前提是代碼裏面使用「///」生成註釋。

 

 

六、博友分享:VS2010在新建.net 4.0項目時,常常會默認一個Clent Profile的東東,常常出現問題。。。切換爲標準框架便可。

VS2005不存在這個問題,VS2013好像也不存在這個問題。

 

七、未能加載程序集

這個問題的範疇過於龐大,可以形成這方面問題的緣由可能有不少,我記得比較分散,後面找到了陸續補充。

(1)版本不匹配。

(2)類庫生成x86仍是x64仍是AnyCPU,最好可以作到目標平臺保持一致。

(3)兩個項目引用路徑不一樣,或生成個路徑不一樣。

 

八、***.dll標記爲系統必備,必須對其進行強簽名。

(1)首先,參考這個地方。http://blog.csdn.net/qiujiahao/article/details/2775262;

(2)其次,出現這個問題,頗有多是由於兩個項目調用了相同的DLL,可是兩個DLL版本不一樣,須要使這兩個版本相同便可。

 

九、如何把Console程序修改成WinForm程序。

(1)修改Program.cs,按照Winform程序的方式來修改便可。

(2)修改應用程序的屬性,在應用程序——輸出類型中修改成Windows應用程序。

 

十、DataGridView在使用其單擊、雙擊事件時,若是須要使用RowIndex,須要判斷其是否小於0(表頭),不然會報錯。

十一、當多個窗體都設置了TopMost,則只有最早設置的窗體在頂層。

十二、引用了DLL,可是編譯的時候仍是提示沒有找到命名空間。

背景:這個問題很坑,很難發現問題所在。如一個解決方案中有項目A,生成類庫,testA.dll;還有項目B,生成類庫,testB.dll。若是項目B的程序集名稱和默認命名空間設置成了testA,則編譯不會報錯,可是你這時候想調用testB中的方法時,會發現根本找不到,全是testA的方法!

解決辦法:右鍵查看項目(也有多是相關項目)的程序集名稱和默認命名空間。是否與類庫名稱一致。

1三、如何修改VS2008轉化後的項目爲2005版。

如上圖:修改第一行Format Version 9.00.修改第二行爲Visual Studio 2005。

1四、DataGridView時間格式設置

dataGridView1.Columns[n].DefaultCellStyle.Format = "yyyy-MM-dd";

1五、當前不會命中斷點。源代碼與原始版本不一樣問題的解決方法

坑到爆的問題來了……這個問題出現大可能是由於混亂的項目引用。如下提供幾個可能有用的解決方案:

方案一:在VS菜單的生成中,選擇「清理解決方案」,而後從新生成解決方案。

方案二:實際上有比這個辦法更好的辦法,就是將出問題的文件用notepad打開,而後另存爲Unicode編碼,覆蓋原來的文件。

方案三:經過從新格式化出問題的源文件亦能夠解決,即在VS2005中選擇 「編輯」——〉「高級」——〉「設置選定內容的格式」。

以上三個方案參考自:http://blog.csdn.net/zztoll/article/details/6688949

實際上我都用了,沒用!

最後解決辦法的:

根據分析,以及這篇文章的內容,出現此問題是由於我直接引用了DLL,而不是直接引用項目。DLL還未從新編譯的時候,直接運行了程序,則形成DLL內容尚未更新,調試沒法運行到斷點。

1六、float doubledecimal的區別

#region

float 單精度浮點 32bit

double 雙精度浮點64bit,

decimal是高精度 128bit,浮點型。

float double 是 基本類型(primitive type),decimal不是。

float 有效數字7位,範圍  ±1.5 × 10E45 to ±3.4 × 10E38

double 有效數字15/16 位,範圍 ±5.0 × 10 E−324 to ±1.7 × 10E308

decimal 有效數字 28/29 位,範圍 ±1.0 × 10E−28 to ±7.9 × 10E28( E -- 下接幾回方) 

decimal的有效位數很大,達到了128位,可是表示的數據範圍卻比floatdouble類型小。

使用的時候會對計算時的性能有影響。

常數寫法:

float f = 12.3F;  (帶F)

double x=12.3;  (不帶就是double)

decimal d = 12.30M; (帶M)

 

浮點數運算會有精度損失問題,有精度損失時程序不會報告,要程序員本身注意。

#endregion

1七、如何清空StringBuilder

 

 一、Remove例:           

StringBuilder val = new StringBuilder();           

val.Append("....");           

val.Remove(0,val.Length);//清空

 

二、Replace          

 StringBuilder val = new StringBuilder();          

 val.Append("....");          

 val.Replace(val.ToString(), "");//清空

 

三、Length            

StringBuilder val = new StringBuilder();           

val.Append("....");           

val.Length = 0;//清空通過測試第三種效率更高,推薦用第三種!

 

 

SQL篇

一、有關SQL中Join的問題。

left join的那個表(子表),on的字段存在兩條,那麼查詢出來的結果會分爲兩條。

——因此對於子表內容掌控不許確,極可能會查詢出不符合需求的結果。

例子:

(1)兩個表的內容是

(2)left join的結果

 

二、同一張表能夠Left Join兩次

——好比主表A爲大掃除任務安排表,其中包含「掃地的學生ID」,「倒垃圾的學生ID」,能夠經過兩次關聯學生信息表B,來在主表中查詢出學生姓名。

——如下例子與上面的舉例無關。僅供參考。

 

三、Union的時候,若是對應的兩個字段類型不一樣,必須進行轉換,不然會出錯。

如上圖convert。注意使用union all能夠顯著提升速度,這樣的話,不會對查詢結果進行排序。

 

四、SQL Server中連接服務器的使用方法

應用背景:應用軟件包含多個數據庫服務器,可是某個查詢須要從兩個數據庫服務器的數據庫中查詢數據的。

使用說明:

(1)添加一個連接服務器。

exec sp_addlinkedserver @server='serverontest',@provider='sqloledb',@srvproduct='',@datasrc='101.123.10.112'

(2)添加登陸方式

EXEC sp_addlinkedsrvlogin @rmtsrvname = 'serverontest', @useself = 'false', @locallogin = 'sa', @rmtuser = 'sa', @rmtpassword = 'passwordofsa'

(3)以上兩個語句中,@server爲服務器的別名,@datasrc爲要連接的目標數據庫的鏈接串,@rmtsrvname爲別名,@locallogin爲本地登陸的用戶名,@rmtuser@rmtpassword爲要連接的目標數據庫的登陸用戶名和密碼。

(4)添加完連接服務器以後,能夠經過select * from sys.linked_logins select * from sys.servers來查看已經添加的連接服務器和登陸角色。

(5)添加完連接服務器後,使用select * from 別名.庫名.dbo.表名 來對其中的數據進行查詢。

(6)刪除連接服務器登陸映射和連接服務器的方法:

  exec sp_droplinkedsrvlogin ’serverontest’ ,’sa’ 

  exec sp_dropserver ’serverontest’

 

思想以及設計理念:

一、邏輯刪除與物理刪除的概念?

物理刪除時真正的刪除了,邏輯刪除還保留數據在數據庫中的位置,可是修改其刪除標誌爲已刪除狀態(貌似這個在大學裏面就學了……)

 

二、在UI層(用戶操做界面),若是出錯了,或者操做失敗了,應該提醒用戶下一步應該作什麼。

如:當用戶進行操做B的時候,須要先開啓選項A。設當前選項A爲關閉狀態,用戶進行操做B,此時應提示:「操做失敗,選項A未啓用,請到XXX設置中開啓選項A」。在某些應用中,甚至能夠增長直接跳轉到設置的地方,或者直接修改設置。根據須要而定。

——提醒用戶改作什麼,我的認爲是應該的,體現友好度。可是不該該把代碼中具體的異常暴露出來,具體異常應該記錄日誌,並使用異常編碼,在文檔中、代碼中管理起來。

 

三、當能夠肯定兩份程序徹底一致,可是怎麼運行結果都不一致,先檢查配置文件是否不一樣。

 

四、如何查看進程的端口號。

命令行輸入:netstat -ano

五、如何使用命令行安裝Windows服務

%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\installutil.exe E:\myService\ServiceTest.exe

Net Start ServiceTest

sc config ServiceTest start= auto

前提是,你所要安裝的服務,所在路徑不能包含空格。如常見的Program Files,就會形成安裝失敗。

若是安裝的時候,命令行窗口一閃而過沒有看到什麼狀況,能夠自行在命令提示符裏面執行以上的腳本以查看報錯。或者在結尾加上pause

 

PS:一個一直支撐個人寶貴經驗:

哈佛有一個著名的理論:人的差異在於業餘時間,而一我的的命運決定於晚上8點到10點之間。每晚抽出2個小時的時間用來閱讀、進修、思考或參加有意的演講、討論,你會發現,你的人生正在發生改變,堅持數年以後,成功會向你招手。

相關文章
相關標籤/搜索