C# ~ 数据库连接

这篇博客介绍了如何使用C#连接到SQL Server数据库,包括数据库连接字符串的配置,针对本地和远程服务器的不同设置。文章重点讲解了如何读取数据库数据,探讨了SqlDataAdapter的Fill方法和获取数据表架构的不同方式,以及在使用这些方法时可能影响性能的因素。最后,提到了通过SQL语句直接获取表的主键和列信息作为扩展学习。

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()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值