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查找并加载指定的类, 也就 ...
随机推荐
- Fix catalyst driver in Ubuntu 13.04 / 13.10
Fix catalyst driver in Ubuntu 13.04 / 13.10(墙外文章备份) 1. Introduction I found lots of people strugglin ...
- HTTP学习笔记(五)
目前,市场上流行有很多web服务器软件,每种服务器都有自己的特点.我们在开发的过程中,经常要和它们打交道,所以了解它们的工作原理也是很重要的. 几款比较流行的服务器 它们会做些什么? 第三篇中有这样的 ...
- MySQL记录
1.unixtime和可读时间的转换 unixtime是距"1970-01-01 08:00:00"的时间秒数 unixtime -> readable select fro ...
- Java用来进行批量文件重命名,批量提取特定类型文件
原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一 ...
- Redis学习笔记~Redis主从服务器,读写分离
回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...
- 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)
回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回 日志记录组件之自主的Vlog>和<第三回 日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...
- [Java面试十]浏览器跨域问题.
此块内容参考Ajax文档部分. 主要复习内容: 1.JavaScript核心对象 2.浏览器BOM对象 3.文档对象模型DOM 4.常见事件 5.Ajax编程( ...
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
PO(persistant object) 持久对象 在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了.通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理.可以 ...
- 编译原理 LL1文法First集算法实现
import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap ...
- ZZUOJ1196: 单调数
/* 注意的事项:是输出小于 10^n的正整数的个数哦!开始的时候总比样例输出多一个数, 纠结了好久,原来是 0加了进去了! dpI[n][m]表示的是第n位添加数字m(0....9)的构成单调递增数 ...