C#操作SQL经典文库.docx

上传人:b****5 文档编号:5970853 上传时间:2023-01-02 格式:DOCX 页数:18 大小:22.39KB
下载 相关 举报
C#操作SQL经典文库.docx_第1页
第1页 / 共18页
C#操作SQL经典文库.docx_第2页
第2页 / 共18页
C#操作SQL经典文库.docx_第3页
第3页 / 共18页
C#操作SQL经典文库.docx_第4页
第4页 / 共18页
C#操作SQL经典文库.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

C#操作SQL经典文库.docx

《C#操作SQL经典文库.docx》由会员分享,可在线阅读,更多相关《C#操作SQL经典文库.docx(18页珍藏版)》请在冰豆网上搜索。

C#操作SQL经典文库.docx

C#操作SQL经典文库

ADO.NET中对数据库的操作是:

断开式连接,只需要写一次连接服务器,库名,用户名,密码的字符串,以后只对con进行close()和con.Open()操作即可连接数据库

先从数据库中取出结果集后进行处理数据后再UpData更新到数据库(共三步)

如果只想读取和显示数据则只需使用数据读取器SqlDataReader即可,但要处理数据然后更新数据库(增加,更改),就需要用数据集DataSet和

数据适配器SqlDataAdaper

SqlDataAdapter在下面有用法:

其中:

读取数据时用SqlDataReader是固定的但是处理数据更新时(增加,更改)为两种情况,

(一)直接拼SQL语句适用于简单的表,

(二)用参数的用到SqlDataAdaper适用于复杂的表

建议:

简单的表可以用

(一)但是在实际项目中复杂的表最好用

(二)

因为带参数的要插入或更改的数据结构已被参数欲留位置了,不用对其进行类型转换,当在后面定义了参数后会自动转换,比较简单

其中删除一条记录不用带参数的直接用

(一)拼SQL语句cmd.ExecuteNonQuery()即可

只有insert和update增加和更改用带参数的如果全部删除也的用带参数的

补充(必看):

定义个全局变量PrivateSqlConnectionm_con=null;

然后在方法内部m_con=new出来

断开式连接体现在:

写一个连接数据库的方法返回bool值以后再就不用写连服务器,库名,用户名,密码的字符串了

以后再连接数据库就直接用m_con.Open();即可打开

publicbooldb_check()//当然复杂时就用传参数形式

{

boolflag=false;

stringConnectionString="datasource="+dbServerName.Text+";initialcatalog="+dbName.Text+";

userid="+dbUsername.Text+";password="+this.dbPassword.Text+";";

try

{

m_con=newSqlConnection(ConnectionString);

m_con.Open();

MessageBox.Show("数据库连接成功!

");

flag=true;

}

catch

{

MessageBox.Show("数据库连接不成功!

");

flag=false;

}

returnflag;

}

(一)、c#连接SQL数据库代码:

==只是一个简单的例子

publicDataTableRead()

{

DataTabledt=newDataTable();//新建表

dt.Columns.Add("col_1");//新建表中的列

dt.Columns.Add("col_2");

stringConnectionString="datasource=localhost;initialcatalog=pubs;userid=sa;password=sa";

SqlConnectionConn=newSqlConnection(ConnectionString);

if(Conn.State==ConnectionState.Open)

{

Conn.Close();

}

Conn.ConnectionString=ConnectionString;

Conn.Open();

try

{

SqlCommandcmd=newSqlCommand("Select*fromtab_name",Conn);

SqlDataReadermyReader=cmd.ExecuteReader();//执行SQL语句的真正查询了

inta=0;

intb=0;//用来接收已经查询出来的字段

while(myReader.Read())每次循环查到的一行如果有N行就循环N次而已

{

DataRowdr=dt.NewRow();//每循环一次新建一行

dr[0]=myReader.GetInt32(0).ToString();表示接收第一个字段(string型)

dr[1]=myReader.GetInt32

(1).ToString();

dt.Rows.Add(dr);//每次循环把dr加进去

}

myReader.Close();

Conn.Close();

}

catch(Exceptionex)

{

MessageBox.Show(ex.Message.ToString());

}

returndt;

}

 

(二)、关于Command对象(SqlCommand有两种方法各有优点)

//只用于查询其实可以用于多记录查询两个SQL语句连起来用myReader.NextResult()即可

(A)SqlCommandcmd=newSqlCommand(SqlText,con);//这是读数据此要和SqlDataReader连用再和ExecuteReader或ExecuteScalar连用.

new这个是用来读数据的就用DataReader来接

这句等同于下面的三句

(B)

//这个不用于查询用于执行T_SQL增删改等等

SqlCommandcmd=con.CreateCommand();

cmd.CommandTest="Createtabletab_name(namevarchar(20),passwordvarchar(20))";

cmd.ExecuteNonQuery();

***说明:

关于SqlCommand用法有ExecuteNonQuery、ExecuteReader,ExecuteScalar三种其中ExecuteReader(所有查询),ExecuteScalar(首行首列查询)

ExecuteNonQuery为执行T-SQL语句但是不建议查询

如果一个类有多个SQL语句要执行用(B)ExecuteNonQuery三句但是ExecuteNonQuery自动执行最靠近它的那句CommandTest(每次只执行一句)

如果一个类中只有一个SQL语句要执行用(A)即可

***说明:

(A)A与ExecuteReader,ExecuteScalar相匹配

(B)B三句的与ExecuteNonQuery相匹配

 

(三)、关于数据读取器SqlDataReader对象(其中SqlDataReader是和SqlCommandcmd=newSqlCommand(SqlText,con)它连用的)

如果只想读取和显示数据则只需使用数据读取器SqlDataReader即可但要处理数据然后更新数据库,就需要用数据集DataSet和适配器SqlDataAdaper

SqlDataReaderreader=newSqlDataReader();

(A)实例:

SqlCommandcmd=newSqlCommand("Select*fromtab_name",Conn);

SqlDataReadermyReader=cmd.ExecuteReader();//执行SQL语句的真正查询了

while(myReader.Read())每次循环查到的一行如果有N行就循环N次而已

{

DataRowdr=dt.NewRow();//每循环一次新建一行

dr[0]=myReader.GetInt32(0).ToString();表示接收第一个字段(string型)

dr[1]=myReader.GetInt32

(1).ToString();

dt.Rows.Add(dr);//每次循环把dr加进去

(B):

GetSchemaTable方法返回一个已填充的DataTable实例(可以一次读出完整表的内容)

DataTableschema=reader.GetSchemaTable();

用它可以把数据库中查询出的结果集以表的形式得到完整的传给schema表

就可以通过DataTable的Rows属性检索行集,通过DataTable的Columns属性检索列集(Rows属性可用于给表添加新行或者从表中删除行,

Columns属性可用于添加列或者删除现有的列)

实例:

DataTableschema=reader.GetSchemaTable();//查询出的结果集以表的形式得到完整的传给schema表

foreach(DataRowrowinschema.Rows)//这时相当于对schema表进行操作了

{

foreach(DataColumncolinschema.Columns)

{

Console.WriteLine(col.ColumnName+"="+row[col]);

Console.WriteLine("==========");

}

}

(C):

reader.NextResult()使用数据读取器处理多个结果集

stringsql_1=@"select*fromtab_1";

stringsql_2=@"select*fromtab_2";//这里一定要有个空格才可以因为当两个SQL语句连接时要用空格分开

stringsql=sql_1+sql_2;

SqlCommandcmd=newSqlCommand(sql,con);//执行两个或多个SQL语句的联合查询

SqlDataReaderreader=cmd.ExecuteReader();//这时有多个结果集

do

{

while(reader.Read())//读取一个结果集的所有内容

{

Console.WriteLine("{0}:

{1}",reader[0],reader[1]);

}

Console.WriteLine("".PadLeft(60,'='));

}

while(reader.NextResult());//循环读下个结果集

***补充:

如果想判断当SqlDataReader没有读出结果时要做的处理方法:

首先要走

while(reader.Read())//读取一个结果集的所有内容

{

Console.WriteLine("{0}:

{1}",reader[0],reader[1]);

}

中的reader.Read();//必须要走这一步

如果想判断当没有读出结果时就必须在While(reader.Read())之后

if(reader.HasRows==false)//判断如果没有读出结果

{

MessageBox.Show("要查询的结果不存在!

");

}

这是没有读出结果时如果读出结果了那就直接走while(reader.Read()){}里面了就不走if(){}里面了

其实如果用到了DataTable也可以用if(dt.Rows.count<0){}也可以的

[SqlDataAdapter]

(四)、SqlDataAdapter

数据集和数据适配器DataSet和SqlDataAdapter

知识点:

SqlDataAdapterda=newSqlDataAdapter();

(1)da.Fill();

(2)da.SelectComand=newSqlCommand(sqlText,con);

(3)DataTabledt=newDataTable();

dt.Select(where条件,升降序);

(4)

填充数据集有两种方法:

使用数据适配器

从XML文档中读取数据

4.1)

SqlDataAdapterda=newSqlDataAdapter();

da.SelectCommand=newSqlCommand(sqlText,con);

DataSetds=newDataSet();

da.Fill(ds,"tab_name");//Fill方法内部使用数据读取器访问表模式和数据,然后使用他们填充数据集

//相当于执行SQL语句后把结果集取出后赋给DataSet中的tab_name表。

4.2)

数据集的筛选和排序:

例子

staticvoidMain(string[]args)

{

stringConnectionString=@"datasource=localhost;initialcatalog=northwind;userid=sa;password=sa;";

stringsql_1=@"select*fromcustomers";

stringsql_2=@"select*fromproductswhereunitprice<10";//注意当第二句连接时要有个空格

stringsql=sql_1+sql_2;//两条SQL语句拼接

SqlConnectioncon=newSqlConnection(ConnectionString);

if(con.State==ConnectionState.Open)

{

con.Close();

}

try

{

con.Open();

SqlDataAdapterda=newSqlDataAdapter();//A

da.SelectCommand=newSqlCommand(sql,con);//B

//其中A和B两句合并相当于:

SqlDataAdapterda=newSqlDataAdapter(sql,con);这一句

DataSetds=newDataSet();

da.Fill(ds,"customers");

DataTableCollectiondtc=ds.Tables;//通过这句把DataSet中的所有表都给了Table表集合

Console.WriteLine("ResultsfrmCustomerstable:

");

Console.WriteLine("CompanyName".PadRight(20)+"ContactName".PadLeft(23)+"\n");

//以下两句是筛选条件

stringfl="country='Germany'";//where条件

stringsrt="companynameasc";//降序

//下面是知识点数据集的筛选条件

foreach(DataRowrowindtc["customers"].Select(fl,srt))//这是用法

//dtc["customers"]说明:

dtc表集合中的customers表.Select()就是筛选条件

{

Console.WriteLine("{0}\t{1}",row["CompanyName"].ToString().PadRight(25),row["ContactName"]);

}

Console.WriteLine("\n----------------------------");

Console.WriteLine("ResultsformProductstable:

");

Console.WriteLine("ProductName".PadRight(20)+"UnitPrice".PadLeft(21)+"\n");

foreach(DataRowrowindtc[1].Rows)

{

Console.WriteLine("{0}\t{1}",row["productname"].ToString().PadRight(25),row["unitprice"]);

}

Console.ReadLine();

}

catch(Exceptionex)

{

Console.WriteLine("Error:

"+ex);

Console.ReadLine();

}

finally

{

con.Close();

}

}

4.3)

使用DataView其实DataView的功能4.2)数据集都可以实现所以一般不常用

DatView是DataTable内容的动态表示,与SQL视图一样,他不保存数据

下面一句就是把dt表中的记录有赋给了DataViewdv然后对dv进行操作DataView有自己的动态方法

DataViewdv=newDataView(dt,"country='Germany'","country",DataViewRowState.CurrentRows);

例子:

staticvoidMain(string[]args)

{

stringConnectionString=@"datasource=localhost;initialcatalog=northwind;userid=sa;password=sa;";

stringsqlText=@"selectcontactname,countryfromcustomers";

SqlConnectioncon=newSqlConnection(ConnectionString);

if(con.State==ConnectionState.Open)

{

con.Close();

}

try

{

SqlDataAdapterda=newSqlDataAdapter(sqlText,con);

//da.SelectCommand=newSqlCommand(sqlText,con);

DataSetds=newDataSet();

da.Fill(ds,"customers");//填充给DataSet中的Customeres表

DataTabledt=ds.Tables["customers"];

//下面一句就是把dt表中的记录有赋给了DataViewdv然后对dv进行操作DataView有自己的动态方法

DataViewdv=newDataView(dt,"country='Germany'","country",DataViewRowState.CurrentRows);

//其中第一个参数是DataTale,第二个是对DataTable内容进行筛选的筛选器,第三个是排序,最后一个参数指定要在视图中包含的行的类型

foreach(DataRowViewdrvindv)

{

for(inti=0;i

{

Console.Write(drv[i]+"\t");

}

Console.WriteLine();

}

Console.ReadLine();

}

catch(Exceptionex)

{

Console.WriteLine("Error:

"+ex);

}

finally

{

con.Close();

}

}

4.4)修改数据集中的记录其实这个4.4)单独是没有意义的应该是4.5以后将更新保存到数据库源

说明:

对数据集所做的变化不会自动保存到数据库中,为了把这些变化保存到数据库中,需要再次连接数据库,显示完成更新

例子:

staticvoidMain()

{

stringConnetionString=@"datasource=localhost;initialcatalog=northwind;userid=sa;password=sa;";

stringqry=@"select*fromemployeeswherecountry='UK'";

stringudp=@"updateemployeessetcity=@citywhereemployeeid=@employeeid";

SqlConnectioncon=newSqlConnection(ConnetionString);

try

{

SqlDataAdapterda=newSqlDataAdapter();

da.SelectCommand=newSqlCommand(qry,con);

DataSetds=newDataSet();

da.Fill(ds,"employees");

DataTabledt=ds.Tables["employees"];

//以下更改了表的信息

dt.Columns["FirstName"].AllowDBNull=true;

dt.Rows[0]["city"]="Wilmington";

//以下为表添加了新行

DataRownewRow=dt.NewRow();

newRow["firstname"]="li";

newRow["lastname"]="yong";

newRow["titleofcourtesy"]="haha";

newRow["city"]="dalian";

newRow["country"]="UK";

dt.Rows.Add(newRow);

//可以显示更新后的信息这时只更新了数据集但是没有更新数据库

foreach(DataRowrowindt.Rows)

{

Console.WriteLine("{0}{1}{2}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1