1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
namespace 我的第一个MDF
{
class Program
{
static void Main(string[] args)
{
/*
*
*让程序去连接项目中的mdf文件,而不是连接bin/Debug下那个。
*
*
*原理简单分析:连接字符串中的DataDirectory的值就是通过AppDomain.CurrentDomain.SetData赋值过去
*的,如果当前程序的目录以"\bin\Debug\"或者"\bin\Release\"则认为它是运行在VisualStudio环境中,
*就取项目的目录然后赋值给DataDirectory这个key。
*既然是CurrentDomain.SetData,
*估计对于非默认AppDomain中的数据库连接代码可能会不起作用(只是猜测,没验证),
*这就要需要创建子AppDomain的时候再去赋值了。
*
*/
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
if (dataDir.EndsWith(@"\bin\Debug\")
|| (dataDir.EndsWith(@"\bin\Release\")))
{
dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
}
// Console.WriteLine(dataDir);
/*连接字符串 告诉程序连接到哪台服务器上
*Data Source=.\SQLEXPRESS 本机的数据库的名字
* AttachDBFilename=|DataDirectory|\Database1.mdf 项目目录下的mdf文件
* Integrated Security=True 使用windows验证方式登录数据库
* User Instance=true 使用用户实例
* 用户实例是对实例的扩展。用户实例与普通实例类似,但它是在需要的时候创建,而普通实例是在安装期间创建的。
用户实例必须由父实例创建,所以使用用户实例时,我们也不能省略 Data Source。
谁打开了数据库连接,谁就是这个用户实例的运行帐户,比如 IUSR_Cftea 运行着网站,
* 它打开了带用户实例的数据库连接,那么这个用户实例就是以 IUSR_Cftea 运行的。
* 由于 SqlConnection中实现了IDisposable 接口
* 此接口的主要用途是释放非托管资源。 当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存。 但无法预测进行垃圾回收的时间。
* 另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无所知。
对于有IDisposable接口的类,需要使用try catch或者 using 来保证资源的回收。
*/
using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=true"))
{
conn.Open();//打开连接
Console.WriteLine("打开数据库连接成功");
//创建sql命令 依然需要使用using来保证资源的回收
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_User";
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read()) //每调用一次read方法 就向下读一行数据。读不到数据了返回false
{
//Console.WriteLine(reader.GetString(1) + reader.GetString(reader.GetOrdinal("Password")));
//reader.GetString(i)得到某一列的值 i是列号
//reader.GetOrdinal("Password") 获得序号
int id = reader.GetInt32(reader.GetOrdinal("Id"));
string username = reader.GetString(reader.GetOrdinal("UserName"));
string password = reader.GetString(reader.GetOrdinal("Password"));
Console.WriteLine(id + " " + username + " " + password);
}
}
}
}
Console.ReadKey();
}
}
}