用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