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查找并加载指定的类, 也就 ...
随机推荐
- jQuery的extend方法的深层拷贝
一些东西长时间不用就忘了,比如这个jQuery的extend方法的深层拷贝,今天看单页应用的书的时候,看到entend第一个参数是true,都蒙了.也是,自己的大部分对jQuery的学习知识来自锋利的 ...
- 好脑袋不如烂笔头-Quartz使用总结
Quartz是Java平台的一个开源的作业调度框架.Quartz.net是从java版本移植到.net版本的..net项目使用Quartz来执行批处理等定时任务非常方便. (1)从nuget上可以安装 ...
- ES2005 js =>
ES2005 js => 不会写js Learn ES2015
- ssh(sturts2_spring_hibernate) 框架搭建之spring
一.spring总结: ⑴.spring是一个轻量级的JAVA开发框架,主要的作用是用来管理实例(可以解决JAVA类中new对象的问题,节省内存资源.)和降低代码之间的耦合性,促进代码模块化. ⑵.促 ...
- 原生JS实现分页效果1.0
不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...
- Android开发常用属性
1.android string.xml 文字中间加入空格 android string.xml前后加空格的技巧 <string name="password">密 ...
- Ajax在IE浏览器会出现中文乱码解决办法
在AJAX浏览器来进行发送数据时,一般它所默认的都是UTF-8的编码. Ajax在IE浏览器会出现中文乱码的情况!解决办法如下 <script type="text/javascrip ...
- CAD2015安装教程 AutoCAD2015中文版安装激活图文教程
28年来,Autodesk一直在坚持不懈地帮助客户提高设计流程效率.AutoCAD提供了可靠的三维自由形状设计工具以及强大的绘图和文档制作功能,在全球拥有数百万用户. autocad2015具有广泛的 ...
- struts深入原理之RequestProcessor与xml
和配置文件相对应的代码(struts1) public void process(HttpServletRequest request, HttpServletResponse response) ...
- SpaceBase – 基于 Sass 的响应式 CSS 框架
SpaceBase 是一个基于 Sass 的响应式 CSS 框架.SpaceBase 是可以在建立和定制您的需要的一个样板层,它结合最佳实践为今天的响应式网页与我们对每一个项目中使用的核心组件. 在线 ...