C#操作SQL经典
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中对数据库的操作是:断开式连接,只需要写一次连接服务器,库名,用户名,密码的字符串,以后只对con 进行close()和con.Open() 操作即可连接数据库
先从数据库中取出结果集后进行处理数据后再UpData更新到数据库(共三步)
如果只想读取和显示数据 则只需使用数据读取器 SqlDataReader即可, 但要处理数据然后更新数据库(增加,更改),就需要用数据集DataSet和
数据适配器SqlDataAdaper
SqlDataAdapter在下面有用法:
其中:读取数据时用SqlDataReader是固定的 但是处理数据更新时(增加,更改)为两种情况,(一)直接拼SQL语句 适用于简单的表,
(二)用参数的 用到SqlDataAdaper 适用于复杂的表
建议:简单的表可以用(一) 但是在实际项目中复杂的表最好用(二)
因为带参数的 要插入或更改的数据结构已被参数欲留位置了,不用对其进行类型转换,当在后面定义了参数后会自动转换,比较简单
其中删除一条记录不用带参数的 直接用(一)拼SQL语句 cmd.ExecuteNonQuery()即可
只有insert 和 update 增加和更改用带参数的 如果全部删除也的用带参数的
补充(必看):定义个全局变量 Private SqlConnection m_con =null;
然后在方法内部 m_con =new 出来
断开式连接体现在:写一个 连接数据库的方法 返回bool值 以后再就不用写连服务器,库名,用户名,密码的字符串了
以后再连接数据库就直接用m_con.Open();即可打开
public bool db_check()//当然复杂时就用传参数形式
{
bool flag=false;
string ConnectionString ="data source =" + dbServerName.Text +";initial catalog=" + dbName.Text + ";
user id=" +dbUsername.Text + ";password=" +this.dbPassword.Text + ";";
try
{
m_con = new SqlConnection(ConnectionString);
m_con.Open();
MessageBox.Show("数据库连接成功!");
flag=true;
}
catch
{
MessageBox.Show("数据库连接不成功!");
flag=false;
}
return flag;
}
(一)、c#连接SQL数据库代码:==只是一个简单的例子
public DataTable Read()
{
DataTable dt =new DataTable();//新建表
dt.Columns.Add("col_1");//新建表中的列
dt.Columns.Add("col_2");
string ConnectionString ="data source=localhost;initial catalog=pubs;user id=sa;password=sa";
SqlConnection Conn= new SqlConnection(ConnectionString);
if (Conn.State==ConnectionState.Open)
{
Conn.Close();
}
Conn.ConnectionString=ConnectionString;
Conn.Open();
try
{
SqlCommand cmd=new SqlCommand("Select * from tab_name",Conn);
SqlDataReader myReader =cmd.ExecuteReader();//执行SQL语句的真正查询了
int a=0;
int b=0;//用来接收已经查询出来的字段
while (myReader.Read()) 每次循环查到的一行 如果有N行就循环N次
而已
{
DataRow dr =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(Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
return dt;
}
(二)、 关于Command对象 (SqlCommand有两种方法各有优点)
//只用于查询 其实可以用于多记录查询 两个SQL语句连起来 用 myReader.NextResult() 即可
(A)SqlCommand cmd =new SqlCommand(SqlText,con);//这是读数据 此要和 SqlDataReader连用 再和ExecuteReader或ExecuteScalar连用.
new 这个是用来读数据的 就用DataReader 来接
这句等同于下面的三句
(B)
//这个不用于查询 用于执行T_SQL增删改等等
SqlCommand cmd =con.CreateCommand();
mandTest="Create table tab_name (name varchar(20),password varchar(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是和SqlCommand cmd =new SqlCommand(SqlText,con)它连用的)
如果只想读取和显示数据 则只需使用数据读取器 SqlDataReader即可 但要处理数据然后更新数据库,就需要用数据集DataSet和适配器 SqlDataAdaper
SqlDataReader reader =new SqlDataReader();
(A)实例:
SqlCommand cmd=new SqlCommand("Select * from tab_name",Conn);
SqlDataReader myReader =cmd.ExecuteReader();//执行SQL语句的真正查询了
while (myReader.Read()) 每次循环查到的一行 如果有N行就循环N次而已
{
DataRow dr =dt.NewRow();//每循环一次新建一行
dr[0] =myReader.GetInt32(0).ToString(); 表示接收第一个字段(string型)
dr[1] =myReader.GetInt32(1).ToString();
dt.Rows.Add(dr);//每次循环把dr加进去
(B):GetSchemaTable方法 返回一个已填充的DataTable实例 (可以一次读出完整表的内容)
DataTable schema =reader.GetSchemaTable();
用它可以把数据库中查询出的结果集以表的形式得到完整的传给schema表
就可以通过DataTable的Rows属性检索行集,通过DataTable 的Columns属性检索列集(Rows属性可用于给表添加新行或者从表中删除行,
Columns属性可用于添
加列或者删除现有的列)
实例:
DataTable schema =reader.GetSchemaTable();//查询出的结果集以表的形式得到完整的传给schema表
foreach(DataRow row in schema.Rows) //这时相当于对schema表进行操作了
{
foreach(DataColumn col in schema.Columns)
{
Console.WriteLine(col.ColumnName + "=" + row[col]);
Console.WriteLine("==========");
}
}
(C): reader.NextResult() 使用数据读取器处理多个结果集
string sql_1=@"select * from tab_1";
string sql_2=@" select * from tab_2";//这里一定要有个空格才可以 因为当两个SQL语句连接时要用空格分开
string sql =sql_1 + sql_2;
SqlCommand cmd =new SqlCommand(sql,con);//执行两个或多个SQL语句的联合查询
SqlDataReader reader =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
知识点:
SqlDataAdapter da =new SqlDataAdapter();
(1)da.Fill();
(2)da.SelectComand=new SqlCommand(sqlText,con);
(3)DataTable dt=new DataTable();
dt.Select(where条件,升降序);
(4)
填充数据集有两种方法:
:使用数据适配器
:从XML文档中读取数据
4.1)
SqlDataAdapter da =new SqlDataAdapter();
da.SelectCommand =new SqlCommand(sqlText,con);
DataSet ds =new DataSet();
da.Fill(ds,"tab_name");//Fill方法内部使用数据读取器访问表模式和数据,然后使用他们填充数据集
//相当于执行SQL语句后把结果集取出后赋给DataSet中的tab_name表。
4.2)
数据集的筛选和排序:例子
static void Main(string [] args)
{
string ConnectionString =@"data source=localhost;initial catalog=northwind;user id =sa;password=sa;";
string sql_1=@"select * from customers";
string sql_2=@" select * from products where unitprice <10";//注意当第二句连接时要有个空格
string sql = sql_1+sql_2;//两条SQL语句拼接
SqlConnection con =new SqlConnection(ConnectionString);
if (con.State==ConnectionState.Open)
{
con.Close();
}
try
{
con.Open();
SqlDataAdapter da=new SqlDataAdapter();//A
da.SelectCommand=new SqlCommand(sql,con);//B
//其中A和B两句合并相当于:SqlDataAdapter da=new SqlDataAdapter(sql,con);这一句
DataSet ds=new DataSet();
da.Fill(ds,"customers");
DataTableCollection dtc =ds.Tables;//通过这句把DataSet中的所有表都给了Table表集合
Console.WriteLine("Results frm Customers table:");
Console.WriteLine("CompanyName".PadRight(20) + "ContactName".PadLeft(23) + "\n");
//以下两句是筛选条件
string fl ="country='Germany'";//where 条件
string srt ="companyname asc"; //降序
//下面是知识点 数据集的筛选条件
foreach(DataRow row in dtc["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("Results form Products table:");
Console.WriteLine("ProductName".PadRight(20) + "UnitPrice".PadLeft(21) + "\n");
foreach(DataRow row in dtc[1].Rows)
{
Console.WriteLine("{0}\t{1}",row["productname"].ToString().PadRight(25),row["unitprice"]);
}
Console.ReadLine();
}
catch(Exception ex)
{
Console.WriteLine("Error:"+ ex);
Console.ReadLine();
}
finally
{
con.Close();
}
}
4.3)
使用DataView 其实DataView 的功能4.2)数据集都可以实现 所以一般不常用
DatView 是DataTable内容的动态表示,与SQL视图一样,他不保存数据
下面一句就是把dt表中的记录有赋给了DataView dv 然后对dv进行操作 DataView有自己的动态方法
DataView dv =new DataView(dt,"country='Germany'","country", DataViewRowState.CurrentRows);
例子:
static void Main(string []args)
{
string ConnectionString =@"data source =localhost;initial catalog =northwind;user id =sa;password=sa;";
string sqlText=@"select contactname,country from customers";
SqlConnection con =new SqlConnection(ConnectionString);
if (con.State==ConnectionState.Open)
{
con.Close();
}
try
{
SqlDataAdapter da =new SqlDataAdapter(sqlText,con);
//da.SelectCommand =new SqlCommand(sqlText,con);
DataSet ds=new DataSet();
da.Fill(ds,"customers");//填充给DataSet中的Customeres表
DataTable dt=ds.Tables["customers"];
//下面一句就是把dt表中的记录有赋给了DataView dv 然后对dv
进行操作 DataView有自己的动态方法
DataView dv =new DataView(dt,"country='Germany'","country", DataViewRowState.CurrentRows);
//其中第一个参数是DataTale,第二个是对DataTable内容进行筛选的筛选器,第三个是排序,最后一个参数指定要在视图中包含的行的类型
foreach(DataRowView drv in dv)
{
for(int i=0;i
Console.Write(drv[i] + "\t");
}
Console.WriteLine();
}
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Error:" + ex);
}
finally
{
con.Close();
}
}
4.4)修改数据集中的记录 其实这个4.4)单独是没有意义的 应该是4.5以后将更新保存到数据库源
说明:对数据集所做的变化不会自动保存到数据库中,为了把这些变化保存到数据库中,需要再次连接数据库,显示完成更新
例子:
static void Main()
{
string ConnetionString=@"data source=localhost;initial catalog=northwind;user id =sa;password=sa;";
string qry=@"select * from employees where country='UK'";
string udp=@"update employees set city=@city where employeeid=@employeeid";
SqlConnection con =new SqlConnection(ConnetionString);
try
{
SqlDataAdapter da= new SqlDataAdapter();
da.SelectCommand =new SqlCommand(qry,con);
DataSet ds=new DataSet();
da.Fill(ds,"employees");
DataTable dt=ds.Tables["employees"];
//以下更改了表的信息
dt.Columns["FirstName"].AllowDBNull=true;
dt.Rows[0]["city"]="Wilmington";
//以下为表添加了新行
DataRow newRow =dt.NewRow();
newRow["firstname"]="li";
newRow["lastname"]="yong";
newRow["titleofcourtesy"]="haha";
newRow["city"]="dalian";
newRow["country"]="UK";
dt.Rows.Add(newRow);
//可以显示更新后的信息 这时只更新了数据集 但是没有更新数据库
foreach(DataRow row in dt.Rows)
{
Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);
}
Console.ReadLine();
}
catch(Exception ex)
{
Console.WriteLine("Error:" + ex);
}
finally
{
con.Close();
}、
4.5)将变化保存到数据源
以下3个属性可用于把数据集中的数据更新和同步到数据源(类似于支持查询的SelectCommand属性)
*UpdateCommand
*InsertCommand
*DeleteCommand
***A)UpdateCommand属性
SqlDataAdapter da =new SqlDataAdapter();
要想对数据库进行修改要是动态的必须有参数
//以下这是第二次操作数据库(用SqlCommand)进行更改
SqlCommand cmd=new SqlCommand(upd,conn);//udp为SQL语句 它是有参数的
cmd.Parameters.A
dd("@city",SqlDbType.NVarChar,15,"city");//为upd语句设定两个参数
cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid");
da.UpdateCommand=cmd;
da.Update(ds,"表名");
static void Main()
{
string ConnectionString =@"data source =localhost;initial catalog=northwind;user id =sa;password=sa;";
string qry=@"select * from employees where country='UK'";//用于从库中取出数据进行更改用的SQL
string upd=@"update employees set city=@city where employeeid =@employeeid";//更改的SQL
SqlConnection conn =new SqlConnection(ConnectionString);
try
{
SqlDataAdapter da =new SqlDataAdapter();
da.SelectCommand=new SqlCommand(qry,conn);
DataSet ds=new DataSet();
da.Fill(ds,"employees");
DataTable dt=ds.Tables["employees"];
(a)dt.Rows[0]["city"]="Wilmington11";//改后的信息 其实是SQL update语句的参数
//以下只是数据集做了更改后显示出来
foreach(DataRow row in dt.Rows)
{
Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);
}
//这以下才是对数据库进行的真正更改
SqlCommand cmd=new SqlCommand(upd,conn);//udp为SQL语句 它的参数是(a)
//设定两个参数
cmd.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");
cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid");
da.UpdateCommand=cmd;//修改赋值
da.Update(ds,"employees");//修改
}
catch(Exception ex)
{
Console.WriteLine("Error:"+ ex);
}
***B)InsertCommand属性
数据适配器使用InsertCommand属性在表中插入行,调用Update方法时,将搜索以前添加到表中的说有新行,并保存到数据库中。
static void Main()
{
string ConnectionString =@"data source=localhost;initial catalog=northwind;user id =sa;password=sa";
string qry=@"select * from employees where country='UK'"; //第一步 从库中取数据SQL语句
string ins=@"
insert into employees(firstname,lastname,titleofcourtesy,city,country) //第二步SQL更改语句
values
(
@firstname,
@lastname,
@titleofcourtesy,
@city,
@country
)
";
SqlConnection conn =new SqlConnection(ConnectionString);
try
{
SqlDataAdapter da=new SqlDataAdapter();
da.SelectCommand=new SqlCommand(qry,conn);
DataSet ds =new DataSet();
da.Fill(ds,"employees");
DataTable dt=ds.Tables["employees"];//已把原库中的数据赋值给了dt
DataRow newRow =dt.NewRow();
//以下添加的每列新行就是 下面参数的要赋的新值
newRow["firstname"]="li";
newRow["lastname"]="yong";
newRow["titleofcourtesy"]="Sir";
newRow["city"]="Birmingham";
newRow["country"]="UK";
dt.Rows.Add(newRow);//然后为dt添加一个新行
foreach(DataRow row in dt.Rows)//把现在的结果遍例出
来
{
Console.WriteLine("{0}{1}{2}",
row["firstname"].ToString().PadRight(15),
row["lastname"].ToString().PadLeft(25),
row["city"].ToString().PadLeft(35)
);
}
SqlCommand cmd =new SqlCommand(ins,conn);//传递InsertCommand SQL更改命令
//以下是设定InsertCommand参数
cmd.Parameters.Add("@firstname",SqlDbType.NVarChar,10,"firstname");
cmd.Parameters.Add("@lastname",SqlDbType.NVarChar,20,"lastname");
cmd.Parameters.Add("@titleofcourtesy",SqlDbType.NVarChar,25,"titleofcourtesy");
cmd.Parameters.Add("@city",SqlDbType.NVarChar,15,"city");
cmd.Parameters.Add("@country",SqlDbType.NVarChar,15,"country");
以下两句是真正的更改数据库
da.InsertCommand=cmd;
da.Update(ds,"employees");
Console.ReadLine();
}
catch(Exception ex)
{
Console.WriteLine("Error:"+ex);
Console.ReadLine();
}
finally
{
conn.Close();
}
}
***C)DeleteCommand 属性
DeleteCommand 属性可用于执行SQL DELETE语句。
static void Main()
{
string ConnectionString =@"data source =localhost;initial catalog=northwind;user id =sa;password=sa;";
string qry=@"select * from employees where country='UK'";//第一步 从库中取数据SQL语句
string del=@"delete from employees where employeeid =@employeeid"; //第二步SQL更改语句
SqlConnection con=new SqlConnection(ConnectionString);
try
{
//注释: 虽然这段代码用的delete语句用到了参数where employeeid =@employeeid
//但是在下面又用到了filt 筛选条件 所以明确了用名字来判断 那么where employeeid =@employeeid就没有意义了
SqlDataAdapter da=new SqlDataAdapter();
da.SelectCommand =new SqlCommand(qry,con);
DataSet ds=new DataSet();
da.Fill(ds,"employees");
DataTable dt =ds.Tables["employees"]; //把原来的数据库中数据提取出来赋给dt
SqlCommand cmd=new SqlCommand(del,con); //传递DeleteCommand SQL更改命令
cmd.Parameters.Add("@employeeid",SqlDbType.Int,4,"employeeid"); //为DeleteCommand添加参数
string filt=@"firstname='li' and lastname='yong'";//筛选条件
foreach(DataRow row in dt.Select(filt))
{
row.Delete();
}
//以下两句真正删除数据
da.DeleteCommand=cmd;
da.Update(ds,"employees");
//把现在的结果集遍例出来
foreach(DataRow row in dt.Rows)
{
Console.WriteLine("{0}{1}{2}",row["firstname"].ToString().PadRight(15),row["lastname"].ToString().PadLeft(25),row["city"]);
}
Console.ReadLine();
}
catch(Exception ex)
{
Console.WriteLine("Error:" + ex);
}
finally
{
con.Close();
}
}
五) 关于DataRowView 的用法(此时要想得到listBox选中的数据(前提是把数据库中的数据赋给listBox))
DataRowView rowView=(DataRowView)this.listBox1.Items[this.list
Box1.SelectedIndex];
string str=rowView.Row.ItemArray[0].ToString();
MessageBox.Show("您选择的是:"+str,"***这种方法只能这样写代码,请看看");
***详见级联菜单的例子
用以下的cmd命令可以创建一个新的iis站点:
C:\Inetpub\AdminScripts> adsutil.vbs create_vserv W3SVC/2
C:\Inetpub\AdminScripts> adsutil.vbs copy W3SVC/1 W3SVC/2
[到9了]
删除:
C:\Inetpub\AdminScripts> adsutil.vbs delete W3SVC/2
List:
C:\Inetpub\AdminScripts> adsutil.vbs enum w3svc /p
当然,创建了以后也只能同时运行一个。