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

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