数据库连接

本文主要介绍几种数据库的连接,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

MySQL

原文地址:https://www.cnblogs.com/wjcx-sqh/p/5929892.html