C# III: 數據庫基本操作

用C#操作數據庫——數據庫使用SQL Server爲例,對應的namespace是System.Data.SqlClient.

  • 讀取數據
    從數據庫中讀取數據是最基本的操作了。
    示例代碼如下:
 String connString = @""; // Connection string
 SqlConnection conn = new SqlConnection(connString);
 try
 {
     String queryString = @"SELECT [ID], [NAME] FROM dbo.TABLE1;";

     conn.Open();
     SqlCommand cmd = new SqlCommand(queryString, conn);
     SqlDataReader reader = cmd.ExecuteReader();
     while(reader.Read())
     {
         Console.Write(reader.GetInt32(0)); // ID
         Console.Write(reader.GetString(1)); // Name
     }
 }
 catch(Exception exp)
 {
     System.Diagnostics.Debug.WriteLine(exp.Message);
 }
 finally
 {
     conn.Close();
     conn.Dispose();
 }
  • 寫入數據
    與讀取數據旗鼓相當的支柱型操作就是寫入了。
    一個簡單的寫入示例(這裏使用了一個await操作以達到異步的效果):
 String connString = @""; // Connection string
 SqlConnection conn = new SqlConnection(connString);
 try
 {
     String queryString = @"INSERT INTO dbo.TABLE1 ([ID], [Name]) VALUES(1, 'Test')"; 

     conn.Open();
     SqlCommand cmd = new SqlCommand(queryString, conn);

     try
     {
         Int32 nRst = await cmd.ExecuteNonQueryAsync();
     }
     catch(Exception exp)
     {
         System.Diagnostics.Debug.WriteLine(exp.Message);
     }
 }
 catch (Exception exp)
 {
     System.Diagnostics.Debug.WriteLine(exp.Message);
 }
 finally
 {
     conn.Close();
     conn.Dispose();
 }
  • Transaction支持
    同時寫入多個有關聯的表時,就需要transaction的支持了。
    一個示例如下:
 String connString = @""; // Connection string
 SqlConnection conn = new SqlConnection(connString);
 try
 {

     conn.Open();
     SqlTransaction trans = conn.BeginTransaction();

     try
     {
         String queryString = @"INSERT INTO dbo.TABLE1 ([ID], [Name]) VALUES(1, 'Test')"; 
         SqlCommand cmd = new SqlCommand(queryString, conn);
         cmd.Transaction = trans;
         Int32 nRst = await cmd.ExecuteNonQueryAsync();

         queryString2 = @"INSERT INTO dbo.TABLE2 ([ID], [Name]) VALUES(2, 'Test2')"; 
         cmd = new SqlCommand(queryString2, conn);
         cmd.Transaction = trans;
         nRst = await cmd.ExecuteNonQueryAsync();     

        trans.Commit();
     }
     catch(Exception exp)
     {
         System.Diagnostics.Debug.WriteLine(exp.Message);
         trans.Rollback();
     }
 }
 catch (Exception exp)
 {
     System.Diagnostics.Debug.WriteLine(exp.Message);
 }
 finally
 {
     conn.Close();
     conn.Dispose();
 }
  • 參數支持
    上述的代碼片中,插入數據庫中的是固定文本。而現實生活中,插入數據庫絕大多數是變量——比如用戶輸入的內容,這時就需要用到參數。
 String connString = @""; // Connection string
 SqlConnection conn = new SqlConnection(connString);
 try
 {
     String queryString = @"INSERT INTO dbo.TABLE1 ([ID], [Name]) VALUES(@id, @name)"; 

     conn.Open();
     SqlCommand cmd = new SqlCommand(queryString, conn);
     cmd.Parameters.AddWithValue( "@id" , 3); 
     cmd.Parameters.AddWithValue( "@name" , 'Test'); 

     try
     {
         Int32 nRst = await cmd.ExecuteNonQueryAsync();
     }
     catch(Exception exp)
     {
         System.Diagnostics.Debug.WriteLine(exp.Message);
     }
 }
 catch (Exception exp)
 {
     System.Diagnostics.Debug.WriteLine(exp.Message);
 }
 finally
 {
     conn.Close();
     conn.Dispose();
 }
  • Identity Value的獲取
    另外一個經常碰到的問題是,當table中一個Column設置爲identity時候,需要取出剛insert成功的數據所獲得的ID。
 String connString = @""; // Connection string
 SqlConnection conn = new SqlConnection(connString);
 try
 {
     // ID is set to identity
     String queryString = @"INSERT INTO dbo.TABLE1 ([Name]) VALUES(@name); SELECT @Identity = SCOPE_IDENTITY();"; 

     conn.Open();
     SqlCommand cmd = new SqlCommand(queryString, conn);
     cmd.Parameters.AddWithValue( "@name" , 'Test'); 
     SqlParameter idparam = cmd.Parameters.AddWithValue("@Identity", SqlDbType.Int); 
     idparam.Direction = ParameterDirection.Output; 

     try
     {
         Int32 nRst = await cmd.ExecuteNonQueryAsync();
         Int32 newID = (Int32)idparam.Value;
     }
     catch(Exception exp)
     {
         System.Diagnostics.Debug.WriteLine(exp.Message);
     }
 }
 catch (Exception exp)
 {
     System.Diagnostics.Debug.WriteLine(exp.Message);
 }
 finally
 {
     conn.Close();
     conn.Dispose();
 }

是爲之記。
Alva Chien
2016.6.29

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