原來一直是java,python等語言,最近用c#語言,並編寫數據庫訪問代碼。使用了之後,這裡總結下,分享下c#如何操作數據庫。
在java等其它語言中,有一套標准的api來完成數據庫訪問,並且一般都是通過sql語句來訪問的。而在c#中,提供了多種靈活的方式。
大致可以分為:
1)和其它語言一樣,直接利用sql命令(包括存儲過程)操作數據庫
2)利用sql語句,同時結合DataSet、DataAdapter等Api,提高使用的效率
3)與gui程序結合,與DataGridView等可視化組件結合。
本文介紹第一種方式。對於第一種方式,主要分為更新語句和查詢語句,需要考慮的有:
1)單條和批量更新語句的執行
2)參數綁定
3)事務處理
.........
下面我們按照常用的使用場景一 一來介紹。
一、更新操作(單條語句)
直接上代碼
using System; using System.Data; using System.Data.SqlClient; namespace DbExample { class DbActor { public void updateDb() { SqlConnection conn = getConnection(); try { conn.Open(); SqlCommand command = new SqlCommand("insert userinfo values('aaa','bb')", conn); int re = command.ExecuteNonQuery(); if (re == 1) { System.Console.WriteLine("inset success"); } else { System.Console.WriteLine("inset error"); } } catch (Exception ex) { System.Console.WriteLine(ex.Message); } finally { conn.Close(); } } private SqlConnection getConnection() { string strConnection = @"Data Source = localhost\SQLEXPRESS; Initial Catalog = mydb; User Id = sa; Password = 12345678;"; SqlConnection conn = new SqlConnection(strConnection); return conn; } } }
需要注意幾點:
1)數據庫鏈接是資源,使用完需要釋放。這在所有其它語言的數據庫訪問中都是這樣的。
2)c#比較討厭的是,它針對不同的數據庫,有不同的數據訪問對象(類名不同,所在的命名空間不同),這裡的api都是Sqlxxxxx,以Sql打頭的api是訪問sql server數據庫的api。這點在使用時需要注意。
3)ExecuteNonQuery 方法的返回值是執行sql命令後影響的記錄的條數。
二、參數綁定
執行sql命令,最基本的就是拼湊一個完整的sql語句執行。但更常用的做法是進行參數傳遞的方式,這樣可以有效利用數據庫的特性,提高同類sql語句(sql命令一樣,只是命令的值不同)的執行效率。舉例代碼如下:
public void updateDbByPara() { SqlConnection conn = getConnection(); try { conn.Open(); SqlCommand command = new SqlCommand("insert userinfo values(@name,@pass)", conn); command.Parameters.Add(new SqlParameter("@name","x1")); command.Parameters.Add(new SqlParameter("@pass", "123")); command.ExecuteNonQuery(); } catch (Exception ex) { System.Console.WriteLine(ex.Message); } finally { conn.Close(); } }
注意:sql語句中的 @參數名 不能用引號括起來,否則就當作字符串值了。
三、事務
當同時執行多條dml語句時,需要考慮在一個事務中執行。下面給出一個例子:
public void updateDbByTrans() { SqlConnection conn = getConnection(); SqlTransaction trans = null; try { conn.Open(); trans = conn.BeginTransaction(); SqlCommand command = new SqlCommand("insert userinfo values(@name,@pass)", conn,trans); command.Parameters.Add(new SqlParameter("@name", "x5")); command.Parameters.Add(new SqlParameter("@pass", "123")); command.ExecuteNonQuery(); command.Parameters.Clear(); command.Parameters.Add(new SqlParameter("@name", "x4")); command.Parameters.Add(new SqlParameter("@pass", "123")); command.ExecuteNonQuery(); trans.Commit(); } catch (Exception ex) { MessageBox.Show(ex.Message); try { trans.Rollback(); } catch { } } finally { conn.Close(); } }
上面執行了兩個sql語句,如果第一個語句成功,但第2個語句失敗,因為在一個事務中,第一個語句也不會生效。
本文介紹了如何直接利用sql語句進行數據庫的更新操作,下面的文章會接著進行數據庫查詢等操作的介紹。