zoukankan      html  css  js  c++  java
  • 数据库连接

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

  • 相关阅读:
    Go 语言机制之逃逸分析
    类型转换和类型断言
    浅析rune数据类型
    Go 文件操作(创建、打开、读、写)
    字符编码笔记:ASCII,Unicode 和 UTF-8
    cmd.exe启动参数详解
    linux下.so、.ko、.a的区别
    Python 和C#的交互
    Innodb表压缩过程中遇到的坑(innodb_file_format)
    更改mysql的加密方式和密码策略
  • 原文地址:https://www.cnblogs.com/wjcx-sqh/p/5929892.html
Copyright © 2011-2022 走看看