前言:
下個月就要去進行Java開發了,以后C#碰的就少了(可惜去年買了三本C#的書,幾乎還是全新的……),平時一些經驗都記在OneNote里面,現在收集整理出來,因為只能利用交接工作的打醬油的時間,暫時沒什么排版,陸續更新中……
里面的經驗基本上都是比較初級的,是在進行開發工作中很可能遇到的問題~很多都是個人總結,搜集,肯定有些不合理甚至錯誤的東西,望不吝指正。
2015年4月1日17:52:17
基本更新完成,還有部分內容記載具體的項目經驗中,還需要篩選下……
C#篇:
1、目標平台的選擇
64位操作系統在編譯VS里的程序時,根據需要設置項目屬性的“目標平台”為x86。如果設置為AnyCPU,則在VS 2005里面是不能“編輯並繼續”的。
——在選擇x86和AnyCPU都可以在32位操作系統上使用。
——選擇x86在64位服務器上運行,可能會造成類庫無法加載的問題。此問題在后文IIS經驗中解釋。
2、取DataTable或者DataGridView里面值的兩種常用方法:
dt.Rows[i].Cells["ID"].Value.ToString(); dt.Rows[0]["Name"].ToString();
前者需要從Value中取值,使用起來不是太方便。后者且不能加Value。
——所有的中括號中都可以使用序號(從0開始)或是字段名(列名、行名)
3、如果沒有使用Linq(一直都用的2.0框架……),可以使用此法來寫執行SQL。如:
string strSQL = string.Format("Insert table_1 values('{0}', '{1}',{2},{3})"
如果是varchar類型,必須使用'';如果是int,目前發現既可使用''也可以不使用,往往寫腳本,嫌麻煩,就都帶上了'',貌似執行上不會有問題,但不知道性能會不會有所下降。如果有知道的朋友請在評論區說下咯。
——有朋友評論說這個容易被注入式攻擊。查了下避免注入式攻擊的方法:1、使用存儲過程;2、參數化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);
4、DLL引用了,但是在代碼里面還是無法調用。
嘗試在DLL的屬性里面設置使用特定版本為False。
5、類庫里的方法在調用的時候,如何讓方法上面顯示自定義說明?
勾選一下項目:屬性——生成——XML文檔文件
——使用類庫的時候,把對應的XML也拷貝的相同目錄,這樣會在VS中看到類庫函數的自定義說明。前提是代碼里面使用“///”生成注釋。
6、博友分享:VS2010在新建.net 4.0項目時,經常會默認一個Clent Profile的東東,經常出現問題。。。切換為標准框架即可。
VS2005不存在這個問題,VS2013好像也不存在這個問題。
7、未能加載程序集
這個問題的范疇過於龐大,能夠造成這方面問題的原因可能有很多,我記得比較分散,后面找到了陸續補充。
(1)版本不匹配。
(2)類庫生成x86還是x64還是AnyCPU,最好能夠做到目標平台保持一致。
(3)兩個項目引用路徑不同,或生成個路徑不同。
8、***.dll標記為系統必備,必須對其進行強簽名。
(1)首先,參考這個地方。http://blog.csdn.net/qiujiahao/article/details/2775262;
(2)其次,出現這個問題,很有可能是因為兩個項目調用了相同的DLL,但是兩個DLL版本不同,需要使這兩個版本相同即可。
9、如何把Console程序修改為WinForm程序。
(1)修改Program.cs,按照Winform程序的方式來修改即可。
(2)修改應用程序的屬性,在應用程序——輸出類型中修改為Windows應用程序。
10、DataGridView在使用其單擊、雙擊事件時,如果需要使用RowIndex,需要判斷其是否小於0(表頭),否則會報錯。
11、當多個窗體都設置了TopMost,則只有最先設置的窗體在頂層。
12、引用了DLL,但是編譯的時候還是提示沒有找到命名空間。
背景:這個問題很坑,很難發現問題所在。如一個解決方案中有項目A,生成類庫,testA.dll;還有項目B,生成類庫,testB.dll。如果項目B的程序集名稱和默認命名空間設置成了testA,則編譯不會報錯,但是你這時候想調用testB中的方法時,會發現根本找不到,全是testA的方法!
解決辦法:右鍵查看項目(也有可能是相關項目)的程序集名稱和默認命名空間。是否與類庫名稱一致。
13、如何修改VS2008轉化后的項目為2005版。
如上圖:修改第一行Format Version 為9.00.修改第二行為Visual Studio 2005。
14、DataGridView時間格式設置
dataGridView1.Columns[n].DefaultCellStyle.Format = "yyyy-MM-dd";
15、當前不會命中斷點。源代碼與原始版本不同問題的解決方法
坑到爆的問題來了……這個問題出現大多是因為混亂的項目引用。以下提供幾個可能有用的解決方案:
方案一:在VS菜單的生成中,選擇“清理解決方案”,然后重新生成解決方案。
方案二:實際上有比這個辦法更好的辦法,就是將出問題的文件用notepad打開,然后另存為Unicode編碼,覆蓋原來的文件。
方案三:通過重新格式化出問題的源文件亦可以解決,即在VS2005中選擇 “編輯”——〉“高級”——〉“設置選定內容的格式”。
以上三個方案參考自:http://blog.csdn.net/zztoll/article/details/6688949
實際上我都用了,沒用!
最后解決辦法的:
根據分析,以及這篇文章的內容,出現此問題是因為我直接引用了DLL,而不是直接引用項目。DLL還未重新編譯的時候,直接運行了程序,則造成DLL內容還沒有更新,調試無法運行到斷點。
16、float 、double和decimal的區別
#region
float 單精度浮點 32bit,
double 雙精度浮點64bit,
decimal是高精度 128bit,浮點型。
float double 是 基本類型(primitive type),decimal不是。
float 有效數字7位,范圍 ±1.5 × 10E−45 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位,但是表示的數據范圍卻比float和double類型小。
使用的時候會對計算時的性能有影響。
常數寫法:
float f = 12.3F; (帶F)
double x=12.3; (不帶就是double)
decimal d = 12.30M; (帶M)
浮點數運算會有精度損失問題,有精度損失時程序不會報告,要程序員自己注意。
#endregion
17、如何清空StringBuilder
1、Remove例:
StringBuilder val = new StringBuilder();
val.Append("....");
val.Remove(0,val.Length);//清空
2、Replace
StringBuilder val = new StringBuilder();
val.Append("....");
val.Replace(val.ToString(), "");//清空
3、Length
StringBuilder val = new StringBuilder();
val.Append("....");
val.Length = 0;//清空經過測試第三種效率更高,推薦用第三種!
SQL篇
1、有關SQL中Join的問題。
當left join的那個表(子表),on的字段存在兩條,那么查詢出來的結果會分為兩條。
——所以對於子表內容掌控不准確,很可能會查詢出不符合需求的結果。
例子:
(1)兩個表的內容是
(2)left join的結果
2、同一張表可以Left Join兩次
——比如主表A為大掃除任務安排表,其中包含“掃地的學生ID”,“倒垃圾的學生ID”,可以通過兩次關聯學生信息表B,來在主表中查詢出學生姓名。
——以下例子與上面的舉例無關。僅供參考。
3、Union的時候,如果對應的兩個字段類型不同,必須進行轉換,否則會出錯。
如上圖convert。注意使用union all可以顯著提高速度,這樣的話,不會對查詢結果進行排序。
4、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’
思想以及設計理念:
1、邏輯刪除與物理刪除的概念?
物理刪除時真正的刪除了,邏輯刪除還保留數據在數據庫中的位置,但是修改其刪除標志為已刪除狀態(貌似這個在大學里面就學了……)
2、在UI層(用戶操作界面),如果出錯了,或者操作失敗了,應該提醒用戶下一步應該做什么。
如:當用戶進行操作B的時候,需要先開啟選項A。設當前選項A為關閉狀態,用戶進行操作B,此時應提示:“操作失敗,選項A未啟用,請到XXX設置中開啟選項A”。在某些應用中,甚至可以增加直接跳轉到設置的地方,或者直接修改設置。根據需要而定。
——提醒用戶改做什么,個人認為是應該的,體現友好度。但是不應該把代碼中具體的異常暴露出來,具體異常應該記錄日志,並使用異常編碼,在文檔中、代碼中管理起來。
3、當可以確定兩份程序完全一致,但是怎么運行結果都不一致,先檢查配置文件是否不同。
4、如何查看進程的端口號。
命令行輸入:netstat -ano
5、如何使用命令行安裝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個小時的時間用來閱讀、進修、思考或參加有意的演講、討論,你會發現,你的人生正在發生改變,堅持數年之后,成功會向你招手。