C# ~ 数据库连接
本文主要介绍几种数据库的连接,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
C# ~ 数据库连接的更多相关文章
- Java数据库连接技术——JDBC
大家好,今天我们学习了Java如何连接数据库.之前学过.net语言的数据库操作,感觉就是一通百通,大同小异. JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力. JDBC API ...
- .NET跨平台之旅:数据库连接字符串写法引发的问题
最近在一个ASP.NET Core站点中遇到一个奇怪问题.当用dotnet run命令启动站点后,开始的一段时间请求执行速度超慢,有时要超过20秒,有时甚至超过1分钟,日志中会记录这样的错误: Sys ...
- Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志
12-3. 数据库连接日志 问题 你想为每次与数据库的连接和断开记录日志 解决方案 EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和 ...
- 如何修复VUM在客户端启用之后报数据库连接失败的问题
在上一篇随笔中介绍了关于重新注册VMware Update Manager(VUM)至vCenter Server中的方法,最近有朋友反应,原本切换过去好好的更新服务为什么某次使用一下就不灵了? 当时 ...
- JDBC_part1_Oracle数据库连接JDBC以及查询语句
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! JDBC part1 JDBC概述 jdbc是一种用于 ...
- tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知. 最近老是发现数据库的连接数如果 ...
- Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池
连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...
- Java-加载数据库驱动,取得数据库连接
在Java中想要进行数据库操作,最重要的两个步骤就是加载数据驱动,然后取得数据库连接. 1.加载 数据库驱动( Class.forName(String className) ): 因为Java是一种 ...
- QT数据库连接的几个重要函数的使用及注意事项(原创)
注:在这里数据库对象等同于数据库连接对象,也就是QSqlDatabase类的对象 QSqlDatabase QSqlDatabase::addDatabase((const QString & ...
- jdbc数据库连接过程及驱动加载与设计模式详解
首先要导入JDBC的jar包:接下来,代码:Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就 ...
随机推荐
- [ZigBee] 2、 ZigBee开发环境搭建
本节介绍ZigBee基本开发环境搭建,附件中有本节介绍的软件下载地址~ 链接:http://pan.baidu.com/s/1bLdqxg 1.IAR Embedded Workbench 的安装 S ...
- http学习笔记(二)—— 嘿!伙计,你在哪?(URL)
我们之所以希望浏览网页,其中一个重要的原因就是庞大的web世界中有很丰富的资源,他就像哆啦a梦的口袋,随时都能拿出我们想要的宝贝.这些资源通过http被传送到我们的浏览器,并展示到我们的屏幕上.而我们 ...
- iOS——Core Animation 知识摘抄(二)
阴影 主要是shadowOpacity .shadowColor.shadowOffset和shadowRadius四个属性 shadowPath属性 我们已经知道图层阴影并不总是方的,而是从图层内容 ...
- [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之材质了解Materials
[我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之材质了解Materials 既上一篇分享了中文字幕的灯光介绍Lights后,本篇分享一下第3个已完工 ...
- NoSQL和Redis简介及Redis在Windows下的安装和使用教程
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/103.html?1455869099 NoSQL简介 介绍redis前,我 ...
- 阿里云上安装mysql步骤/ 阿里云ECS搭建Java+mysql+tomcat环境
使用阿里云ECS挺长一段时间了.这两天碰巧朋友小白让我一步一步教他在ECS上搭建Java+mysql+tomcat环境,所以把在这里把步骤在这简单整理了一下,以便需要的人查阅. 我购买的阿里云服务器系 ...
- Ubuntu16配置静态IP
一.静态IP地址配置 sudo vi /etc/network/interfaces 然后按照如下格式修改: 注意这里的网卡名字是ens33 auto lo iface lo inet loopbac ...
- 深入理解javascript作用域系列第四篇——块作用域
× 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...
- DOM操作表格
前面的话 表格table元素是HTML中最复杂的结构之一.要想创建表格,一般都必须涉及表示表格行.单元格.表头等方面的标签.由于涉及的标签多,因而使用核心DOM方法创建和修改表格往往都免不了要编写大量 ...
- maven -- 学习笔记(一)之maven环境搭建
首先先感谢博主的分享http://www.cnblogs.com/yjmyzz/p/3495762.html 基本概念: Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建 ...