C#连接数据库PostSQL-NpgSQL
C#NpgSQL連接數據庫PostSQL
??最近在做一個GIS的圖像處理系統,功能設計涵蓋大量的數據存儲和訪問。思來想去:數據存儲到SHP文件的字段中,雖然比較方便但是訪問檢索總是不那么方便,數據庫是必須的。桌面端連接數據庫之前確實沒有整過,只用JS管理過一次。就那次還是學校作業直接拷貝桂桂大兄弟的,這次自己搞了。C#連接本地PostSQL數據庫。加油,阿喵一定行。
??主要內容: ①NpgSQL使用,②數據庫連接,③數據庫增刪改查。
1. NpgSQL使用
2. 數據庫使用邏輯及說明
2. 數據庫連接
3. 增刪改查常用方法
4. 使用示例
1.NpgSQL使用
??應該是專門用來管理PostSQL數據庫的吧,開源的。其他的數據庫不知道能不能訪問。PostSQL就不多說了,安裝很方便,使用起來自帶的Pgadmin好像確實有點捉急,配合Navicat管理倒是不錯。使用C#訪問本地數據庫,特別是PostSQL的話,就用NpgSQL就Ok了,直接用NuGet為你的解決方案添加即可。右擊選擇“管理NuGet程序包”
??在彈出的對話框中搜索NpgSQL,選擇對應版本就可以了。具體版本我沒找到明確說明,但是我 自己的程序是4.0,所以選了一個比較低的版本——2.2.0。還可以使用沒有大問題。
2.數據庫使用邏輯及說明
??使用代碼訪問操作部署在本地的數據,其實比我們想象的復雜很多。不然也不會單獨有專門的課程、職業來研究和從事相關的工作。我們個人使用的話,可視化來講無非是在一個表格(Table)中插入或者修改值。只要我們細心一點,就能按時按需完成操作。可是當我們需要修改、查找大量數據的時候,就會力不從心。
??所以數據庫本身也有一定的機制來保證大量數據能夠存儲的穩定,池。最大限度訪問量是一個池,池有點抽象,安全得來講就是數據庫是個房間,進出房間要把門關好。不僅是大量的數據,還可能有大量用戶同時操作。這其中不同人的身份、權限不一樣,能進行的操作的也不一樣。不僅如此,一個數據同時供多人的查看,就可能會發生的一定的錯誤。(回憶起了老師上課講的范式啊什么的,忘了OJ2…)
??說明:本文不搞復雜就是連接、增刪改查,自己的系統用不到;太嚴謹的我也不會寫;追求高級設定的應該不會看我的博文。對于還在連接和訪問這一步糾結的小白來講,提醒一下:以下方法對基本數據庫的基本操作有所封裝,我也會盡量做注釋說明。
3.數據庫連接
??連接本地數據庫就是拿出鑰匙打開房門。這把對應你本地安裝的數據庫、需要用戶名及密碼驗證的鑰匙,就是:連接。當然,你不會沒事干就去數據庫房里轉一圈,所以在你的程序設計中,當需要對數據庫范根操作之前,需要打開連接(Connectio.open());完事之后要關閉連接(Connection.close.())
??以下將配置連接的方法封裝為“fun_getConnection”,返回一個類型為“NpgsqlConnection”的變量,其實就是連接本身。視需要,打開或關閉。
4.數據庫使用——增刪改查
??還是封裝,我把能封裝的都封裝了。不過也有一部分不太科學,適用我這個系統的需求,各位看官如需使用可能還要修改。我盡量說明白。不管增刪改查都是通過設置好的連接,讓它執行對應的SQL(SQL百科)語句實現數據操作。 相當于對設置好的連接發送指令,然后執行。
??相當于,完成某一功能需要兩步①設置SQL語句,②執行SQL語句。我這邊把編譯不同的功能(增刪改查)封裝一個獨立的方法,將執行命令的部分單獨封裝——“ExecuteNonQuery”,每個功能之后加入該方法進而實現。
??首先是執行命令的方法,有兩個。區別在于形參是否包含待處理的SQL參數。即完整SQL語句使用執行命令一“ExecuteNonQuery”;帶參SQL使用執行命令二“ExecuteCommand” 執行命令之前,通過上文所述方法獲取數據庫連接,并打開。使用后關閉連接。
??新建表操作,輸入表名和對應的列名即可,并返回表名。
public static string fun_createNewDB(string date) {string dBName = "dt" + date;string sqlstr = string.Format("CREATE TABLE {0} (id varchar(10) COLLATE pg_catalog.default NOT NULL,exg numeric,exr numeric,rgbi numeric,vari numeric,rgbvi numeric,ndi numeric,cive numeric,exg_exr numeric,lri numeric,fw numeric,dw numeric,pmc numeric)", dBName);// NpgsqlConnection conn = fun_getConnection();int c = ExecuteNonQuery(sqlstr);return dBName;}??增刪改查,返回受影響行數
/// <summary>/// 插入,新建一行/// </summary>/// <param name="w_tableName">表名</param>/// <param name="w_valuse">數值list</param>/// <returns></returns>public static int fun_Add(string w_tableName, ArrayList w_valuse){//設置SQL語句,我使用的數值是8個 可以根據需要使用循環改善string str = string.Format("insert into {0} values ({1},{2},{3},{4},{5},{6},{7},{8},{9})", w_tableName, w_valuse[0], w_valuse[1], w_valuse[2], w_valuse[3], w_valuse[4], w_valuse[5], w_valuse[6], w_valuse[7], w_valuse[8]);//執行語句int c = ExecuteNonQuery(str); //返回受影響的行數return c;}/// <summary>/// 刪除數據/// </summary>/// <param name="w_table">表名</param>/// <param name="id"></param>/// <returns></returns>public static int fun_delete(string w_table,int id){string sql = "delete from "+ w_table+"users where id =" + id + "";//執行語句int c = ExecuteNonQuery(sql);return c;}/// <summary>/// 更新數據/// </summary>/// <param name="w_table">表名</param>/// <param name="v">更新數值+ID</param>/// <returns></returns>public static int fun_update(string w_table, ArrayList v){if (w_table == " "){System.Windows.Forms.MessageBox.Show("參數有誤");int c = 0;return c;}else{string sqlstr = string.Format("update {0} set fw= '{1}',dw='{2}',pmc='{3}' where id = '{4}' ", w_table, v[1], v[2], v[3],v[0]);int c = ExecuteNonQuery(sqlstr);return c;}//參數較多較麻煩可以用下面這個方法實現,使用待參執行,用執行語句命令二實現//string update_sql = "update @tablename set fw_uav = '@fw',dw_uav='@dw',pmc_uav='@pmc' where id = '@id'";//NpgsqlParameter[] values = new NpgsqlParameter[]//{// new NpgsqlParameter("@id",v[0]),// new NpgsqlParameter("@fw",v[1]),// new NpgsqlParameter("@dw",v[2]),// new NpgsqlParameter("@pmc",v[3]),// };// int c = pgHelper.ExecuteCommand(update_sql, values);// return c;}/// <summary>/// 查找 /// </summary>/// <param name="w_columns">返回列名 默認*</param>/// <param name="w_table">表名</param>/// <param name="w_where">條件語句,完整where</param>/// <returns></returns>public static DataSet fun_search(List<string> w_columns, string w_table, string w_where){//判斷參數string columns = "";string where = "";string tablename = w_table;string str = "";//SQL語句//設置返回列名,無則全部返回if (w_columns.Count == 0){columns = "*";}else{for (int i = 0; i < w_columns.Count; i++){columns += w_columns[i].ToString() + ",";}columns = columns.Substring(0, columns.Length - 1);//刪除最后一個,}//設置查詢條件if (w_where != ""){where = w_where;str = string.Format("select {0} from {1} {2}", columns, w_table, where);}else{str = string.Format("select {0} from {1}", columns, w_table);}NpgsqlConnection conn = fun_getConnection();using (NpgsqlCommand SqlCommand = new NpgsqlCommand(str, conn)){DataSet dataSet = new DataSet();NpgsqlDataAdapter nda = new NpgsqlDataAdapter(SqlCommand);nda.Fill(dataSet);conn.Close();return dataSet;}}
5.完整使用示例
??將上述方法封裝成類“pgHelper.cs”,添加到解決方案中
private void btn_Test_Click(object sender, EventArgs e){string tablename = "Testtable"//新建數據庫string tablename = pgHelper.fun_createNewDB(tablename);//存儲數據,省略Values設置int reslutVount = pgHelper.fun_Add(tablename, values);//數據庫查詢 valuelist為空對應獲取全部值 表名 查詢條件DataSet r = pgHelper.fun_search(valueList, tablename, sqlstr);}返回目錄
歡迎大家反饋交流。
本文鏈接:https://blog.csdn.net/qq_38560619/article/details/107524546
總結
以上是生活随笔為你收集整理的C#连接数据库PostSQL-NpgSQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 基础教程 -
- 下一篇: [react] react中的key有什