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