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查找并加载指定的类, 也就 ...
随机推荐
- 在AWS中创建NAT节点
NAT, Network Address Translation,即网络地址转换.当内部网络的主机想要访问外网,但是又不想直接暴露给公网,可以通过NAT节点来访问外网.这样做有两个好处,第一是内网的主 ...
- JMS确认机制
JMS中为数不多的重点就是消息的确认机制,下面分别介绍J2EE和Spring的MessageListenerContainer的确认机制 J2EE中JMS确认机制 在JMS规范中一共4种确认方式 AU ...
- Redis的使用模式之计数器模式实例
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/123.html?1455853785 Redis 是目前 NoSQL 领域 ...
- C#并行编程-线程同步原语
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- Android笔记——活动的生命周期
一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...
- ssh(sturts2_spring_hibernate) 框架搭建之spring
一.spring总结: ⑴.spring是一个轻量级的JAVA开发框架,主要的作用是用来管理实例(可以解决JAVA类中new对象的问题,节省内存资源.)和降低代码之间的耦合性,促进代码模块化. ⑵.促 ...
- ViewPager做图片浏览器,加载大量图片OOM的问题修正
/** * @author CHQ * @version 1.0 * @date 创建时间: 2016/7/26 17:18 * @parameter * @return * 图片查看器 * //可以 ...
- 你用过这种奇葩的C#注释吗?如何看待
本人虽然不是专业开发人员,也非专业出身,但一直使用C#堆码,解决自己日常的小问题.包括自己的研究,也是用C#来实现和测试.对C#是情有独钟.虽然C#的很多高级技术不会用,也不太懂,但总归是知道,耳闻目 ...
- 解决firefox和IE9对icon font字体的跨域访问问题
何为跨域访问,为什么会有跨域限制?一切还得从浏览器的同源策略说起. 同源策略:是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能会受到影响,可以说Web是构建在同源策略基础 ...
- 2014 -> 2015
2014年初在公司的发展不太顺利, 发现比好多小伙伴的发展速度都要慢了,钱不多,职位也不高,做的事情成长也不快. 为了职业发展考虑,年中就一直想换一个好一点的工作机会, 年中拿了好几个offer, 有 ...