1、Sql Server 基本操作
1.1Sql Server安装默认新建四个系统数据库
Sql Server安装默认新建四个系统数据库
- Master数据库:Master数据库是Sql Server中最终要的数据库它记录Sql Server实例的所有系统及信息。包括实例范围的元数据、端点、链接服务器和系统配置设置
- Tempdb数据库:tempdb是一个临时数据库,用于保存临时对象或中间结果集
- Model数据库:用作SQLServer实例上创建的所有数据库的模板。对Model数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有数据库
- msdb库:用于SQL Server代理计划警报和作业
1.2 数据库常用对象
- 1、表:表是包含数据库中所有数据的数据库对象,由行和列组成,用于组织和存储数据。
- 2、字段:表中每列称为一个字段,字段具有自己的属性,如字段类型、字段大小等。其中,字段类型时字段最重要的属性,它决定了字段能够存储哪种数据。SQL规范支持5中基本字段类型:字符型、文字性、数值型、逻辑性和日期/时间型。
- 3、索引:索引是一个单独的、五路的数据结构。它是依赖于表建立的,在数据库中索引使数据库程序无需对整个表进行扫描就可以在其中找到所需的数据。
- 4、视图:是是从一张或多张表中导出的表(也称为虚拟表),使用户查看数据表中数据的一种方式。表中包含几个被定义的数据列与数据行,其结构和数据建立在对表的查询基础上。
- 5、存储过程:存储过程(Stroed Procedure)是一组为了完成特定功能的SQL语句几个(包括查询、插入、删除和更新等操作),经编译后一名称的的形式存储在SQL Server服务器端的数据库中。由用户通过指定存储过程的名字来执行。当这个存储过程被调用执行时,这些操作也会同时执行。
- 6、主键:就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,单会非常难以处理,因此没有特殊理由表都要设定主键。
- 主键有两种选用策略:业务主键和逻辑主键
- 业务主键使用有业务意义的字段做主键,比如设分正好,银行卡号等;
- 逻辑主键是使用没有任何意义的字段做主键。因为很难保证业务主键不会重复(身份证号重复)不会编号(账号升为)因此推荐逻辑主键
1.3 创建与删除数据库
1.4 创建与删除数据表
设为主键
1.5 数据库文件和文件组
1.6 char与Varchar区别
Varchar(size):保存可变长度的字符串(可包含字母、数字及特殊字符)在括号中指定字符串的最大长度。对多255个字符。注释:如果值的长度大于255,则被转换为Text类型。 char(10):标识固定长度为10个字符,如果不足,就以空格填充 varchar(10):标识长度最大为10的可变字符,不足不填充。(var——variable可变)
1.7 nvarchar与varchar区别
存储方式:navarchar——字符存储, varchar字节存储 存储量:varchar比较节省控件,因为存储大小为字节的世界长度,而nvarchar是双字节存储。 使用:如果存储内容都是英文字符而没有孩子等其他语言符号,建议使用varchar;含有汉字的使用nvarchar,因为nvarchar是使用Unicode变慢,既同一的字符编码标准,会较少乱码的出现几率;(如果你做的项目可能设计不同语言之间的转换,建议用nvarchar)
2 简单SQL语句的应用
新建表时,必须存放相应的数据才能新建表
create database mydarlydb001
create database mydarly002
drop database mydarlydb001
create table darlytable
(
id int,
name nvarchar(5),
pwd nvarchar(20)
)
drop table darlytable
use mydarly002
create table darlytable
(
id int,
name nvarchar(5),
pwd nvarchar(20)
)
create table darlytable002
(
id int identity(1,1) primary key,
name nvarchar(5),
pwd nvarchar(20)
)
create table darlytable003
(
id int identity(1,1) primary key,
name nvarchar(5),
gender nvarchar(1),
age int,
jointime date,
department nvarchar(8)
)
insert darlytable003
(name,gender,age,jointime,department)
values('张三','男',20,'2022-02-20','研发部')
insert darlytable003
(name,gender,age,jointime,department)
values('李四','女',19,'2022-02-20','测试部')
update darlytable003 set department='销售部' where name='李四'
update darlytable003 set name='王五' where id=3
update darlytable003 set jointime='1990-12-01'
select * from darlytable003
select * from darlytable003 where age>=20
select * from darlytable003 where gender='男'
create table darly004
(
u_id int,
name nvarchar(5),
username nvarchar(10)
)
insert darly004(u_id,name,username)values(1,'张三','zhsan908')
insert darly004(u_id,name,username)values(2,'王五','wangwu902')
insert darly004(u_id,name,username)values(3,'李四','lisi901')
select * from darly004,darlytable003 where darlytable003.id=darly004.u_id
delete darlytable003 where gender='男'
delete darlytable003
3、错误处理
3.1保存表报错
解决方法
3.2 Windows防火墙阻止了远程调试
当调试数据库里的存储过程时提示”Windows防火墙当前阻止了远程调试”. 解决方案:Windows防火墙阻止了远程调试 也可以直接选择第三项——确定然后执行sql语句
3.3 操作数类型冲突: int 与 date 不兼容
3.4 将截断字符串或二进制数据。
4、ADO.NET简介
- ADO.net的名称起源于ADO(ActiveX date Objects) 是一个COM组件库,也就是一个通用矿建类库,该类库将跨越所有存在WindowsApi函数。简单来说,他是在.NET编程环境中使用的数据访问接口
- ADO.NET是与C#和.NET Framework一起使用的类集名称,用于以关系型的,面向表的格式访问数据
- ADO.NET被集成到.NET Framework中,可用于任何.net语言,尤其是C#
- ADO.NET技术五大对象
- Connection: 链接
- Command:命令
- DataReader:
- DataAdapter:数据适配器
- DataSet:数据集
- ADO.NET有两部分组成:
- 数据提供程序(provider):它能和数据库保持链接并且执行SQL命令,操作数据集
- 数据集(DataSet):能与数据库在断开链接的情况下进行数据操作。
- 数据库比作水源,存储了大量的水(数据);
- Connection好比深入水中的进水龙头,保持与水的解除,只有它与水进行了“链接”其他对象才可以抽水
- Command则向抽水机,为抽水提供懂了和执行方法,通过“水龙头”,然后把水返给上面的水管。
- DataAdapter、DataReader就想输水管,担任这水的传输任务,并起着桥梁作用。
- DataAdapter象一个睡熟iguana,通过发动机,把水从水源输送到水库进行保存
- DataReader也是一种输水管,起着同样的作用。和DataAdapter不同的是,DataReader不把水送到水库中,而是单向第直接把水送到需要水的用户哪里,所以要比在水库中转一下速度更快
- DataSet则是一个大水库,把抽上来的水按一定关系的池子进行存放。即使撤掉“抽水装置”(断开链接,离线状态)也可以保持“水”的存在。这也正是ADO.NET的核心
- DataTable则向水库中每个独立的水池子,分别存放不同种类的水。一个大水库有一个或多个这样的水池子组成。
5、Connectiong 链接和关闭数据库
为了方位数据库,就要提供数据库连接类,在C#中,是通过Connection类来实现的。它有四种类型的链接方式
- SQLConnection
- ADOConnection
- OracleConnection
- ODBCConnection
5.1连接设置
5.2创建连接
创建连接SQL Server数据库的字符一般有两种
- 一种以SQL验证登录
- 另一种是以Windows身份验证
- 步骤
- 引用命名空间System.Data.SqlClient
- 创建连接方法声明至字符串中
- 创建Connection对象
- 调用方法
5.3 关闭数据库
- 为了节省系统资源,提高系统性能,最好使用完数据库后就要关闭连接。
- 在C#语言由于GC(垃圾回收机制——garbage collection)的存在,会在未来某个时刻释放资源,它是非决定性的,并不能确定这个过程在什么时候发生当顽疾关闭数据时,可通过USING语句确保对象在退出时,立即被释放,从而达到关闭数据库的作用。
- using语句不仅大提高了性能,而且还达到关闭数据库的功能。还有一种通过try。。。catch 。。。。finally语句控制链接数据库的关闭来提高性能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
namespace 链接和关闭数据库
{
class Program
{
static void Main(string[] args)
{
string constr = "Server=.; integrated security=SSPI; Initial Catalog=csharpzx";
SqlConnection mysqlCon = new SqlConnection(constr);
mysqlCon.Open();
Console.WriteLine("第一种方式成功打开数据库");
mysqlCon.Close();
Console.WriteLine("第一种方式打开的数据库被关闭");
Console.ReadKey();
string constr2 = "Server=.; user=sa;pwd=darly;database=csharpzx";
SqlConnection mysqlCon2 = new SqlConnection(constr2);
using (mysqlCon2)
{
mysqlCon2.Open();
Console.WriteLine("第二种方式成功打开数据库");
}
try
{
mysqlCon2.Open();
Console.WriteLine("try catch finally 打开关闭数据库");
}
catch (Exception)
{
throw;
}
finally
{
mysqlCon2.Close();
Console.WriteLine("数据库成功关闭");
}
try
{
using (mysqlCon2)
{
mysqlCon2.Open();
Console.WriteLine("using与try...Catch finally打开数据库成功");
}
}
catch (Exception)
{
throw;
}
finally
{
mysqlCon2.Close();
}
Console.ReadKey();
}
}
}
6、Command操作数据
6.1 Command常用属性
- CommandText:要下大值数据源的命令
- CommandTimeout:出错时等待时间
using System;
using System.Data.SqlClient;
namespace Command操作数句
{
class Program
{
static void Main(string[] args)
{
string myconstr = "Server=.; user=sa; pwd=darly; database=csharpzx";
SqlConnection myCon = new SqlConnection(myconstr);
try
{
myCon.Open();
string sql = "select * from mytable";
SqlCommand mycom = new SqlCommand(sql, myCon);
mycom.CommandTimeout = 2;
Console.WriteLine("创建对象成功");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
myCon.Close();
}
Console.ReadKey();
}
}
}
6.2 Command三种方法
- ExecuteNonQuery()不返回任何值,一般应用于insert update delecte语句中
- ExecuteScalar()返回一个值,一般用于值返回一个值的语句,如求数据统计的count,最大数Max语句,求最小数Min语句
- ExecuteReader() 返回一个IDataReader,可用于迭代返回记录
using System;
using System.Data.SqlClient;
namespace Command操作数句
{
class Program
{
static void Main(string[] args)
{
string myconstr = "Server=.; user=sa; pwd=darly; database=csharpzx";
SqlConnection myCon = new SqlConnection(myconstr);
try
{
myCon.Open();
string sql = "select max(age) from mytable";
SqlCommand myCom = new SqlCommand(sql, myCon);
int t = 0;
t = (int)myCom.ExecuteScalar();
Console.WriteLine("年龄最大的是"+t+"岁");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
finally
{
myCon.Close();
}
Console.ReadKey();
}
}
}
6.2.1DataReader
- DataReader对象提供了用顺序的、只读的方式读取Command对象的数据结果集。正是因为DaaReader是以DataReader是以顺序的方式连续读取数据,所以DataReader会以独占的方式打开数据库链接。
- 由于DataReader只执行读操作,并且每次只在内存缓冲区里存储结果集中的一条数据,所以使用DataREader对象的效率比较高,如果要查询大量数据,同时不需要随机访问和修改数据,DataReader是有限的选择。
- DataReader属性
- FieldCount:标识记录中有多少字段
- HasRows:用来标识DataREader是否包含数据
- IsClosed:标识DataReader是否关闭
实例:判断表中是否有数据(通过查询表中返回DataRedaer对象,经HasRows属性判断表中是否有数据)
using System;
using System.Data.SqlClient;
namespace DAtaReader
{
class Program
{
static void Main(string[] args)
{
string constr = "server=.;user=sa;pwd=darly;database=csharpzx";
SqlConnection mycon = new SqlConnection(constr);
try
{
mycon.Open();
string sql = "select * from mytable";
SqlCommand mycom = new SqlCommand(sql, mycon);
SqlDataReader mydr = mycom.ExecuteReader();
if (mydr.HasRows)
{
Console.WriteLine("表中存在数据");
}
else
{
Console.WriteLine("表中不存在任何数据");
}
Console.WriteLine(mydr.FieldCount);
Console.WriteLine(mydr.IsClosed);
mydr.Close();
Console.WriteLine(mydr.IsClosed);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
finally
{
mycon.Close();
}
Console.ReadKey();
}
}
}
- DataReader常用方法
- close:将DataReader对象关闭
- GetDataRypeName取得指定字段的数据形态
- GetName方法:区指定字段的字段名成
- GetOrdinal: 取得指定字段名称在记录中的顺序
- GetValue:取得指定字段的数据
- GetValues:取得全部字段的数据
- Read:读取下一条记录
using System;
using System.Data.SqlClient;
namespace DAtaReader
{
class Program
{
static void Main(string[] args)
{
string constr = "server=.;user=sa;pwd=darly;database=csharpzx";
SqlConnection mycon = new SqlConnection(constr);
try
{
mycon.Open();
string sql3 = "select * from mytable";
SqlCommand mycom3 = new SqlCommand(sql3, mycon);
SqlDataReader mydr3 = mycom3.ExecuteReader();
object[] myobj = new object[mydr3.FieldCount];
Console.WriteLine("Read读取下一条数据,循环一次后,read自动移到下一条");
while (mydr3.Read())
{
Console.Write(mydr3[0].ToString()+",");
Console.Write(mydr3[1].ToString() + ",");
Console.Write(mydr3["gender"].ToString() + ",");
Console.WriteLine();
}
Console.WriteLine(mydr3.IsClosed);
mycon.Close();
Console.WriteLine(mydr3.IsClosed);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
finally
{
mycon.Close();
}
Console.ReadKey();
}
}
}
7、DataSet数据集
- ADO.NET数据访问技术的一个突出特点就是支持离线访问,而实现这种离线访问技术的核心就是DataSet对象,该对象通过将数据主流在内存来实现离线访问。
- DataSet对象由一组DataTable对象组成,这些对象与DataRelation对象互相关联。这些Data Table对象又包含Rows(行)集合、Columns(列)集合,Rows集合是由多个DataRow对象组成,Columns集合是由多个DataColumns对象组成
- 步骤:
- 引入命名空间System.Data
- 创建DataSet对象
- 创建DataTable对象
- 将DataTable对象加入DataSet对象中。
- 定义列,并向DAtaTable中添加已经定义好的列
- 插入行数据
- 进行相关操作
using System;
using System.Data;
namespace DataSet数据集
{
class Program
{
static void Main(string[] args)
{
DataSet mydataset = new DataSet("数据集练习");
DataTable mytable = new DataTable("mytable001");
mydataset.Tables.Add(mytable);
DataColumn mycol1 = new DataColumn("id", Type.GetType("System.INt32"));
DataColumn mycol2 = new DataColumn("name", Type.GetType("System.String"));
DataColumn mycol3 = new DataColumn("department", Type.GetType("System.String"));
DataColumn mycol4 = new DataColumn("gender", Type.GetType("System.Char"));
DataColumn mycol5 = new DataColumn("age", Type.GetType("System.Int32"));
mytable.Columns.Add(mycol1);
mytable.Columns.Add(mycol2);
mytable.Columns.Add(mycol3);
mytable.Columns.Add(mycol4);
mytable.Columns.Add(mycol5);
string[,] mydata = { { "张三", "测试部", "男", "18" }, { "李四", "公关部", "女", "18" }, { "王五", "研发部", "男", "28" } };
for (int i = 0; i < mydata.Length/4; i++)
{
DataRow myRow = mytable.NewRow();
myRow[0] = i;
myRow["name"] = mydata[i, 0];
myRow[2] = mydata[i, 1];
myRow[3] = mydata[i, 2];
myRow["age"] = mydata[i, 3];
mytable.Rows.Add(myRow);
}
mydataset.AcceptChanges();
}
}
}
- 方法
- clear:移除表中所有行来清除任何数据的DataSet(清空数据集中所有数据)
- Clone:复制该DataSet的机构,但不复制数据
- Copy:复制DataSet的结构和数据
- Dispose: 释放DataSet对象
- Equals:确定两个DataSet对象是否仙童
- Merge: 将指定的DataSet DataTable或DataRow对象的数组合并到当前的DAtaSet或DataTAble中
- Reset:将DataSet重置为初始化状态
using System;
using System.Data;
namespace DataSet数据集
{
class Program
{
static void Main(string[] args)
{
DataSet mydataset = new DataSet("数据集练习");
DataTable mytable = new DataTable("mytable001");
mydataset.Tables.Add(mytable);
DataColumn mycol1 = new DataColumn("id", Type.GetType("System.Int32"));
DataColumn mycol2 = new DataColumn("name", Type.GetType("System.String"));
DataColumn mycol3 = new DataColumn("department", Type.GetType("System.String"));
DataColumn mycol4 = new DataColumn("gender", Type.GetType("System.Char"));
DataColumn mycol5 = new DataColumn("age", Type.GetType("System.Int32"));
mytable.Columns.Add(mycol1);
mytable.Columns.Add(mycol2);
mytable.Columns.Add(mycol3);
mytable.Columns.Add(mycol4);
mytable.Columns.Add(mycol5);
string[,] mydata = { { "张三", "测试部", "男", "18" }, { "李四", "公关部", "女", "18" }, { "王五", "研发部", "男", "28" } };
for (int i = 0; i < mydata.Length/4; i++)
{
DataRow myRow = mytable.NewRow();
myRow[0] = i+1;
myRow["name"] = mydata[i, 0];
myRow[2] = mydata[i, 1];
myRow[3] = mydata[i, 2];
myRow["age"] = mydata[i, 3];
mytable.Rows.Add(myRow);
}
mydataset.AcceptChanges();
Console.WriteLine("更改前的数据");
outValues(mydataset);
DataTable mydt002 = mytable.Clone();
DataRow mydataRow2 = mydt002.NewRow();
mydt002.Rows.Add(new object[] { 5, "赵六", "研发部", "男", "38" });
mydt002.Rows.Add(new object[] { 6, "王二", "研发部", "男", "38" });
mydataset.Merge(mydt002);
Console.WriteLine("\n合并好的数据集");
outValues(mydataset);
DataSet myds001 = mydataset.Copy();
DataSet myds002 = mydataset.Clone();
Console.WriteLine("copy结果");
outValues(myds001);
Console.WriteLine("Clone结果");
outValues(myds002);
Console.Read();
}
public static void outValues(DataSet ds)
{
foreach (DataTable outtable in ds.Tables)
{
Console.WriteLine("表的名称"+outtable.TableName);
foreach (DataRow outdrow in outtable.Rows)
{
foreach (DataColumn outcolum in outtable.Columns)
{
Console.Write(outdrow[outcolum]+"\t");
}
Console.WriteLine();
}
}
}
}
}
8、数据适配器DataAdapter
- DataAdapter对象是DataSet和数据源之间的桥梁,可以建立并初始化表(即DataTable),对数据源执行SQL指令,与DataSet对象结合提供DataSet对象存取数据,可视为DataSet对象的操作核心
- 在使用DataAdapter对象时,只需要设置SQL命令和数据库链接两个参数,就可以通过Fill方法把查询结果放置在一个DataSet对象中。
- 实例:填充DAtaSet数据集:利用DAtaAdapter的Fill方法实现。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace DataAdapter数据适配
{
class Program
{
public static void outvalue(DataSet ds)
{
foreach (DataTable dt in ds.Tables)
{
Console.WriteLine("表名" + dt.TableName);
foreach (DataRow drow in dt.Rows)
{
foreach (DataColumn dcolumn in dt.Columns)
Console.WriteLine(dcolumn + "\t");
Console.WriteLine();
}
}
}
static void Main(string[] args)
{
string constr = "Server=.;user=sa;pwd=darly;database=csharpzx";
SqlConnection mycon = new SqlConnection(constr);
try
{
mycon.Open();
string sql = "Select * from mytable";
SqlDataAdapter myda = new SqlDataAdapter(sql, mycon);
DataSet myds = new DataSet();
myda.Fill(myds, "mytable");
outvalue(myds);
Console.WriteLine("填充成功");
Console.Read();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
finally
{
mycon.Close();
}
}
}
}
- DataAdapter对象可用于执行数据库的命令操作,含有四个不同的操作命令:
- SelectCommand:用来需求数据源中的记录
- InsertCommand:用来向数据源中新插入一条记录
- UpdateCommand:用来更新数据中的数据;
- DeleteCommand:用来输出数据源中的记录
实例2:更新数据域DataAdapter的Update方法可用来将DataSet中的更改解析会数据源
using System;
using System.Data;
using System.Data.SqlClient;
namespace DataAdapter数据适配
{
class Program
{
static void Main(string[] args)
{
string constr = "Server=.;user=sa;pwd=darly;database=csharpzx";
SqlConnection mycon = new SqlConnection(constr);
try
{
mycon.Open();
string updatesql = "updtae mytable set gender='女' where name='张三'";
SqlDataAdapter myda = new SqlDataAdapter("select * from mytable", mycon);
myda.UpdateCommand = new SqlCommand(updatesql, mycon);
DataSet myds = new DataSet();
myda.Fill(myds, "mytable");
Console.WriteLine("原dataSet对象内容");
outvalue(myds);
DataRow myrow = myds.Tables[0].Rows[0];
myrow["gender"] = "女";
myda.Update(myds, "mytable");
Console.WriteLine("更改后DataSet内容");
outvalue(myds);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
finally
{
mycon.Close();
}
Console.Read();
Console.ReadLine();
}
public static void outvalue(DataSet ds)
{
foreach (DataTable dt in ds.Tables)
{
Console.WriteLine("表名" + dt.TableName);
foreach (DataRow drow in dt.Rows)
{
foreach (DataColumn dcolumn in dt.Columns)
{
Console.Write(drow[dcolumn] + "\t");
}
Console.WriteLine();
}
}
}
}
}
实例
利用SQL语句创建数据库Company,在其中创建一个clerk表,表中存放员工姓名,性别,年龄,入职时间,部门,然后向表中添加几条数据 通过DataReader打印所创建表的信息 通过DateSet打印所创建表的信息
create database company
use company
create table clerk
(
id int identity(1,1) primary key,
name nvarchar(5),
gender nvarchar(1),
age int,
department nvarchar(10),
jointime date
)
insert Clerk(name,gender,age,department,jointime)Values('张三','男',35,'市场部','2022.02.26')
insert Clerk(name,gender,age,department,jointime)Values('李四','女',30,'测试部','2022.02.26')
insert Clerk(name,gender,age,department,jointime)Values('王五','男',34,'研发部','2022.02.26')
insert Clerk(name,gender,age,department,jointime)Values('赵六','女',20,'公关部','2022.02.26')
select * from clerk
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace 实例
{
class Program
{
static void Main(string[] args)
{
string constr = "Server=.;user=sa;pwd=darly;database=company";
SqlConnection mycon = new SqlConnection(constr);
try
{
mycon.Open();
string sql = "select * from clerk";
SqlCommand mycom = new SqlCommand(sql, mycon);
SqlDataReader mydr = mycom.ExecuteReader();
Console.WriteLine("使用DataReader打印输出");
for (int i = 0; i < mydr.FieldCount; i++)
{
Console.Write(mydr.GetName(i) + "\t");
}
Console.WriteLine();
while (mydr.Read())
{
for (int i = 0; i < mydr.FieldCount; i++)
{
Console.Write(mydr[i].ToString() + "\t");
}
Console.WriteLine();
}
mydr.Close();
Console.WriteLine("使用DataSet打印输出");
SqlDataAdapter myda = new SqlDataAdapter(sql, mycon);
DataSet myds = new DataSet();
myda.Fill(myds, "Clerk");
foreach (DataTable mytable in myds.Tables)
{
foreach (DataColumn col in mytable.Columns) Console.Write(col.ColumnName + "\t");
Console.WriteLine();
}
foreach (DataTable mytable in myds.Tables)
{
foreach (DataRow row in mytable.Rows)
{
foreach (DataColumn col in mytable.Columns) Console.Write(row[col] + "\t");
Console.WriteLine();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
finally
{
mycon.Close();
}
Console.Read();
}
}
}
|