C#操作数据库经典

来源:互联网 发布:python raw_input 编辑:程序博客网 时间:2024/05/12 18:16

转自:http://blog.csdn.net/Pet8766/article/details/7575637

ADO.NET中对数据库的操作是:断开式连接,只需要写一次连接服务器,数据库名,用户名,密码的字符串,以后只对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();
 cmd.CommandTest="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<dv.Table.Columns.Count;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.Add("@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.listBox1.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

当然,创建了以后也只能同时运行一个。     

0 0
原创粉丝点击