本文主要介绍几种数据库的连接,SQL Server、DB2、MySQL等。
SQL Server
- 服务器:“Data Source=服务器IP; Initial Catalog=数据库; User ID=用户名; Password=密码”
- 本地:“server=.; database=数据库; User ID=用户名; Password=密码; Trusted_Connection=True”
如果是本地,可以不需要用户名和密码,直接 “server=.; database=数据库; Trusted_Connection=True” 凭借 Windows 认证连接数据库。
数据库信息
SqlConnection conn = new SqlConnection() conn.ConnectionString = Const.DBConnectionString; conn.Open(); conn.DataSource, conn.Database;
其中,DataSource、Database 分别表示 数据库(IP)地址、数据库名称。
SqlConnection:表示SQL Server数据库的一个打开的连接
public sealed class SqlConnection : DbConnection, ICloneable { public override string Database { get; } // 获取当前已连接或要连接的数据库名称 public override string DataSource { get; } // 获取要连接的数据库源地址 public override string ConnectionString { get; set; } public override ConnectionState State { get; } public override int ConnectionTimeout { get; } public override string ServerVersion { get; } public SqlConnection(); public SqlConnection(string connectionString); public override void Open(); public override void Close(); protected override void Dispose(bool disposing); public SqlCommand CreateCommand(); // 返回SqlConnection数据源的架构信息 public override DataTable GetSchema(); // 清空与指定连接关联的连接池 public static void ClearPool(SqlConnection connection); public static void ClearAllPools(); }
下面给出一个简单的数据库连接 创建、释放 的示例
/// <summary> /// 创建 /// </summary> public void Create() { string connectionString = "ConnectionString"; Assert(connectionString != null); m_Connection = new SqlConnection(connectionString); // or new DB2Connection() m_Connection.Open(); Assert(m_Connection.State == ConnectionState.Open); LogEvent("数据库连接成功"); } /// <summary> /// 释放 /// </summary> public void Destroy() { if (m_Connection == null) { return; } if (m_Connection.State != ConnectionState.Closed) { m_Connection.Close(); } m_Connection.Dispose(); }
此处提供一个不错的数据库帮助类,具体参见:DBHelper;
注:连接池由第一个连接创建,最后一个连接Close删除时连接池会同时被删除
- 当连接被Close时,该连接被放置在连接池中以备重用、并不会真正被删除;
- 当连接被Dispose时,连接会被彻底删除;
SqlCommand:表示要对SQL Server数据库执行的一个T-SQL语句或存储过程
public sealed class SqlCommand : DbCommand, ICloneable { public SqlConnection Connection { get; set; } public override CommandType CommandType { get; set; } public override string CommandText { get; set; } public override int CommandTimeout { get; set; } public SqlTransaction Transaction { get; set; } public SqlParameterCollection Parameters { get; } public SqlCommand(); public SqlCommand(string cmdText); public SqlCommand(string cmdText, SqlConnection connection); public SqlCommand Clone(); // 执行T-SQL语句并返回受影响的行数 public override int ExecuteNonQuery(); public override void Cancel(); }
下面给出获取表相关信息的几个示例
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();
(1)直接利用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() }
(2)直接利用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() }
DB2
DB2相关信息参见:DB2初识-sqh;