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()
}