C# ~ 數據庫連接

C#連接數據庫(SQL Server)進行數據的讀取和寫入,學習之。

1. 數據庫連接

 ·  服務器
 “Data Source=服務器IP; Initial Catalog=數據庫; User ID=用戶名; Password=密碼”
 ·  本地
  “server=.; database=數據庫; Trusted_Connection=True”

 數據庫信息

SqlConnection conn = new SqlConnection()
conn.ConnectionString = Const.DBConnectionString;
conn.Open();
conn.DataSource, conn.Database;  

 DataSource、Database 分別表示 數據庫(IP)地址、數據庫名稱。

2. 讀數據

  SqlDataAdapter 的 Fill 方法僅用數據源中的表列和錶行來填充 DataTable,默認情況下不會將源表的架構信息添加到 DataTable 中,提供兩種方法,同時獲取主鍵和約束信息。注意,外鍵約束信息不包含在內:

string sql = "select * from TableName where 1=2";
DataTable dtResult = new DataTable();
SqlConnection conn = new SqlConnection();
conn.ConnectionString = Const.DBConnectionString;
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(sql, conn); 

 ·  SqlDataAdapter 的 MissingSchemaAction 屬性設置爲 AddWithKey
  sda.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  sda.Fill(dtResult);   
 ·  SqlDataAdapter 的 FillSchema 方法
  sda.FillSchema(dtResult, SchemaType.Source);

"主鍵信息":dtResult.PrimaryKey.Length 
foreach (DataColumn dtPK in dtResult.PrimaryKey){
  "主鍵列列名":dtPK.ColumnName,"主鍵列類型":dtPK.DataType.Name;
}
"約束信息":dtResult.Constraints.Count
foreach (Constraint dtCon in dtResult.Constraints){
  "約束名:{0}":dtCon.ConstraintName
}

 當使用 FillSchema 方法或將 MissingSchemaAction 屬性設置爲 AddWithKey 時,將需要在數據源中進行額外的處理以確定主鍵列信息,額外處理可能會降低性能。注意,數據讀取完畢後應關閉數據庫連接:conn.Close();

擴展學習
 ·  直接利用SQL語句獲取表的主鍵信息
 主鍵信息:列名、列類型、列長度、所屬表名、主鍵名稱 

sql = @"SELECT columns.name AS ColumnName, types.name AS ColumnType,
        cast(columns.max_length as int) AS ColumnLength,
    schema_name(sys.objects.schema_id)+'.'+ sys.objects.name AS CTabName,
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE.CONSTRAINT_NAME AS PrimaryKey
FROM sys.columns INNER JOIN sys.types
  ON columns.system_type_id=types.system_type_id
    AND columns.user_type_id=types.user_type_id
         LEFT JOIN sys.extended_properties
  ON columns.object_id=extended_properties.major_id
    AND columns.column_id=extended_properties.minor_id
         LEFT JOIN sys.objects
  ON columns.object_id=sys.objects.object_id
         LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE
  ON COLUMN_NAME=columns.name AND TABLE_SCHEMA+'.'+TABLE_NAME=schema_name(sys.objects.schema_id)+'.'+sys.objects.name
WHERE sys.objects.name in TableName AND CONSTRAINT_NAME is not null
ORDER BY sys.objects.name";
"主鍵信息":dtResult.Rows.Count
for (int i = 0; i < dtResult.Rows.Count; ++i){
  "主鍵列列名":dtResult.Rows[i]["ColumnName"].ToString()
  "主鍵列類型":dtResult.Rows[i]["ColumnType"].ToString()
  "主鍵列數據長度"int.Parse(dtResult.Rows[i]["ColumnLength"].ToString())
  "主鍵名字":dtResult.Rows[i]["PrimaryKey"].ToString()
  "所屬表名":dtResult.Rows[i]["CTabName"].ToString()
}

 ·  直接利用SQL語句獲取表的列信息
 列信息:列名、列類型、列長度、所屬表名

sql = @"SELECT  columns.name AS ColumnName, types.name AS ColumnType, 
        cast(columns.max_length as int) AS ColumnLength,                                                   schema_name(sys.objects.schema_id)+'.'+ sys.objects.name AS CTabName
FROM sys.columns INNER JOIN sys.types
  ON columns.system_type_id=types.system_type_id 
    AND columns.user_type_id=types.user_type_id
         LEFT JOIN sys.extended_properties
  ON columns.object_id=extended_properties.major_id 
    AND columns.column_id=extended_properties.minor_id
         LEFT JOIN sys.objects
  ON columns.object_id=sys.objects.object_id
WHERE sys.objects.name in TableName 
ORDER BY sys.objects.name";
"列信息":dtResult.Rows.Count
for (int i = 0; i < dtResult.Rows.Count; ++i){
  "列名":dtResult.Rows[i]["ColumnName"].ToString()
  "列類型":dtResult.Rows[i]["ColumnType"].ToString()
  "列數據長度"int.Parse(dtResult.Rows[i]["ColumnLength"].ToString())
  "所屬表名":dtResult.Rows[i]["CTabName"].ToString()
}
發佈了60 篇原創文章 · 獲贊 21 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章